例1 设定义如下图形控件基类
typedef struct _graphic_ctrl {……} GRAPHIC_CTRL;
定义一个图形控件对象:GRAPHIC_CTRL stGCtrl;
可以操作这个对象的方法:gctrl_Create(&stGCtrl,NULL),这个方法根据对象的CtrlSort自动选择对应的派生类的创建函数。
如果另外需要定义一个类,如文本输入框,它除了继承基类外,还有自己的属性和方法,C语言的实现是将基类包含在子类的结构体中,例2说明了继承的实现。
例2文本输入类继承基类
typedef struct _text_edit
{
GRAPHIC_CTRL stGCtrl;
char *p_chBuf;
…… /* Other attributes of TextEditor */
} TEXT_EDIT;
定义一个文本输入框对象:TEXT_EDIT stTextEdit;它可以操作父类的方法,如gctrl_Create(&stTextEdit,NULL)。
一个按钮和一个文本输入框的回车响应动作是不同的,如何实现控件这种需求呢?改变它调用方法的实现细节,这就是多态的特性。
例3 重载RespBtn方法实现多态
void EnterBtn(void);
void EnterTextEdit(void);
GRAPHIC_CTRL stBtn;
TEXT_EDIT stTextEdit;
ConstructBtn(&stBtn, EnterBtn);
ConstructTextEdit(&stTextEdit, EnterTextEdit);
现在,终于可以展现一下面向对象带来的优势了。设系统响应用户的“回车”按键,软件可以不考虑控件对象的类别而统一调用RespBtn ()方法,这就实现了软件开发的精髓之一:高度抽象把复杂的事情简单化,例4描述了这种统一操作。
例4 统一响应控件的回车操作
gctrl_RespBtn((GRAPHIC_CTRL *)&stBtn);
gctrl_RespBtn((GRAPHIC_CTRL *)&stTextEdit);
有了上述C语言实现面向对象的基础后,我们再来考虑设计图形控件就变得容易多了。
3按钮
如右图4个按钮: