关于如何利用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++面向对象那么完善,不过对于简单的手机应用开发,已经能够胜任了,如果还想研究更加深入的东西,可以读一读高通平台的内部代码。
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++面向对象那么完善,不过对于简单的手机应用开发,已经能够胜任了,如果还想研究更加深入的东西,可以读一读高通平台的内部代码。
相关文章推荐
- 如何利用ccform自定义表单来增加自己的控件,关于Sys_FrmEle表结构与数据存储设计?
- 如何写出正确的二分查找?——利用循环不变式理解二分查找及其变体的正确性以及构造方式
- 如何高效利用github提升自己
- 关于程序员如何提高自己的一些感言
- Activiti监听器中如何利用各种服务或者自己写的Service
- 自己写的关于LINQ to sql类的利用反射的深复制,做个记录
- 手把手一步一教你如何利用Visual Studio创建自己的模板
- 如何在ArcGIS Online中构建自己的应用程序模板高级篇-利用数据
- 如何利用C++ Builder 5.0 Enterprise 创建用户自己的网上聊天程序
- 关于如何利用CARRAY实现二维数组
- 如何利用自己的电脑做服务器发布tomcat的WEB项目供外网、局域网访问
- 关于在struts2中利用jquery中如何动态从数据库中加载图片并显示
- 关于如何在服务器上搭建tomcat并发布自己的web项目
- 作为一名基层管理者如何利用情商管理自己和团队(二)
- 如何编写自己的缓冲区溢出利用程序? (zz)
- 如何利用wordpress搭建自己独立的博客(个人网站)
- 如何i自己创建利用百度搜索引擎的搜索框?
- 关于如何提高自己的写程序的思维!
- 【百度地图API】如何利用自己的数据制作社交地图?只显示可视区域内的标注
- 【百度地图API】如何利用自己的数据制作社交地图?只显示可视区域内的标注