3.2 类多态的BREW页面迁移方案
经过上述分析可以看出,手机中的页面迁移问题与C++中实现的多态效果十分相似,也就是完成一个窗体接口类的实现, 该接口类能完成绘制屏幕和接收客户键盘输入的功能,对于客户的相同输入, 不同的窗体结构应该能体现出不同的行为。如果可以利用C语言这种非面向对象的语言写出面向对象的程序,将有利于提高程序的重用性、模块化功能以及健壮性。
BREW平台中的宏QINTERFACE,GET_PVTBL,DECLARE_VTBL可以用来完成这种效果。其本质就是在基类的层次上定义一个“空函数集”,通过该空函数集实现一个抽象的,虚拟的,通用的接口层,可以在运行时根据对象的实际类型动态地调用派生类的那些“具体”函数,简言之,就是同一个接口函数,根据具体的对象,调用具体的函数。
使用时首先通过Qinterface定义了一个包含VTBL(虚函数表)的接口,在运行时,根据具体传入的对象类型调用了具体派生接口的“具体”函数。如:#define IWINDOW_Enable(p)GET_PVTBL(p, IWindow)->Enable(p, TRUE)这里p是IWINDOW指针类型。用户调用IWINDOW_Enable(p)时,虽然此时传入的是IWINDOW类型指针,但是其实质是派生的具体接口类型,所以最终调用到的就是属于它(派生具体接口)的具体接口函数了。
以下代码用于完成一个满足上述要求的页面迁移过程。
typedef struct _IWindowIWindow;
QINTERFACE(IWindow)
{
void (*Enable)(IWindow * po, boolean bEnable);
void (*Redraw)(IWindow * po);
boolean(*HandleEvent)(IWindow * po, AEEEvent eCode, uint16 wParam, uint32 dwParam);
……
};
#define IWINDOW_Enable(p) GET_PVTBL(p, IWindow)->Enable(p, TRUE)
…
#define IWINDOW_Redraw(p) GET_PVTBL(p, IWindow)->Redraw(p)
#define IWINDOW_HandleEvent(p, e, w, dw) GET_PVTBL(p, IWindow)->HandleEvent(p, e, w, dw)
……
#define INHERIT_CWindow(iname)
DECLARE_VTBL(iname)
IShell * m_pIShell;
IDisplay * m_pIDisplay;
struct CWindow
{
INHERIT_CWindow(IWindow);
};
具体实现的功能如图1所示:
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说计算机基于BREW平台的多态机制实现(2)在线全文阅读。
相关推荐: