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

来源:互联网 发布:json格式化js插件 编辑:程序博客网 时间:2024/06/06 05:30

--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++面向对象那么完善,不过对于简单的手机应用开发,已经能够胜任了,如果还想研究更加深入的东西,可以读一读高通平台的内部代码。