您的位置:首页 > 其它

关于如何利用AEEINTERFACE和QINTERFACE构造自己的类

2010-10-21 13:24 363 查看
--2006.1.11

1、关于AEEINTERFACE。

typedef struct _ISample ISample;

AEEINTERFACE(ISample)
{
INHERIT_IQueryInterface(ISample);

// add your fun...
void (* Fun)(ISample* po);
};

struct ISample
{
const AEEVTBL(ISample) *pvt;

// add your var...
uint32 m_uRef;
};

宏INHERIT_IQueryInterface的含义是:从基接口IBase继承它的几个关键函数指针AddRef, Rlease, QueryInterface
这样,就很简单的构造出了一个基于AEEINTERFACE的ISample接口,你可以在Fun函数指针后面添加你所需要的函数指针,在m_uRef后面添加你所需要的成员变量,然后用面向对象的眼睛去观察它,那么他就是个类了,虽然他之前放的是个struct。
还有,如果你比较勤快,或者你想模仿一下BREW平台的那些库函数,又或者你不想让别人知道你到底用了哪些成员,你就可以用宏来定义你的那些成员函数,就像BREW平台那样:
#define ISAMPLE_Fun(p) AEEGETPVTBL(p, ISample)->Fun((p))
这样,是不是比较cool,不过也有画蛇添足的功能。

2、关于QINTERFACE
example中mediaplayer的源代码实在是比较经典,所以就拿里头的IWindow作为例子吧

typedef struct _IWindow IWindow;

QINTERFACE(IWindow)
{
void (*Enable)(IWindow * po, boolean bEnable);
void (*Redraw)(IWindow * po);
boolean (*HandleEvent)(IWindow * po, AEEEvent eCode, uint16 wParam, uint32 dwParam);
void (*Delete)(IWindow * po);

// add your fun in base struct
};

#define INHERIT_CWindow(iname) /
DECLARE_VTBL(iname) /
CMediaPlayer * m_pOwner; /
IShell * m_pIShell; /
IDisplay * m_pIDisplay; /
flg m_bActive:1
// add your var in base struct

struct CWindow
{
INHERIT_CWindow(IWindow);
};

struct CMainWin
{
INHERIT_CWindow(IWindow);

IImage * m_pLogo;
AEERect m_rectLogo;
IMenuCtl * m_pMainMenu;
flg m_bAbout:1;
// add your var in sub struct
};

IWindow就是一个结构体,所有成员都是函数指针,因此也可以称它为接口。INHERIT_CWindow这个宏很重要,继承都靠它了。你可以在上面标注的地方,给基类添加你的数据成员和成员函数。那么当数据成员和成员函数合并,就构成为了CWindow基类。很明显CMainWin是从CWindow派生出来的,如果最好只添加数据成员,如果添加成员函数,就会暴露和成员函数同级的数据成员,那么封装性就会降低了。

如果你还是想模仿BREW平台,那么可以这么写:
#define IWINDOW_HandleEvent(p, e, w, dw) GET_PVTBL(p, IWindow)->HandleEvent(p, e, w, dw)

在这个应用里头,注意两个宏:DECLARE_VTBL和GET_PVTBL。
还可以注意一下IWINDOW_HandleEvent这个函数,对于不同的CWindow,就对应不同的XXX_HandleEvent,那么不同的窗体就会体现不同的行为。

大概也就这么多,不过到底是C语言的模拟,很难达到C++面向对象那么完善,不过对于简单的手机应用开发,已经能够胜任了,如果还想研究更加深入的东西,可以读一读高通平台的内部代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐