关于如何利用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++面向对象那么完善,不过对于简单的手机应用开发,已经能够胜任了,如果还想研究更加深入的东西,可以读一读高通平台的内部代码。
- 关于如何利用AEEINTERFACE和QINTERFACE构造自己的类
- 如何自己构造ADO的ConnectionString
- 如何从0构造自己的系统?
- 如何构造自己的barrier函数?(七)
- 构造自己的DIB类
- 如何利用Gappproxy 搭建自己的代理服务器
- 如何利用jQuery扩展自己的插件
- 如何利用PPTP设置自己的VPN
- 如何利用github绑定自己的域名
- 关于如何制作自己的Java第三方类库,以及如何制作自己类库的Javadoc
- 在C#的构造函数中,如何显式的先调用父类或者是自己的构造函数?
- 如何利用altera 给出的megafunction配置成自己想要的FIFO和RAM
- 关于如何controller层的构造
- 关于父类没有缺省的构造函数时,子类如何建立构造函数
- Flex中如何利用tabStyleName, firstTabStyleName, lastTabStyleName和selectedTabTextStyleName样式,定制自己的TabNavigator
- 深度学习12:能力提升, 一步一步的介绍如何自己构建网络和训练,利用MatConvNet
- java中关于构造函数内部调用自己的问题
- 关于子类和父类的构造方法的问题
- Struts2输入校验总结
- swig扩展php(一)
- Android入门第十篇之PopupWindow
- 关于数字右对齐和用0填充格式化字符串的方法
- 一道shell编程题_按要求重命名文件
- 关于如何利用AEEINTERFACE和QINTERFACE构造自己的类
- 开发BREW扩展类
- C++运算符重载(成员函数以及友元函数实现)
- 高工推荐要读的计算机书
- 一个不错的flash图表
- C++的10种境界 看看你处于第几级
- 小心List的subList方法
- Java EE
- 从AutoCAD 到 Inventor应用程序移植释疑