例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个按钮: