brew 中的接口机制
来源:互联网 发布:3d打印算法arduino 编辑:程序博客网 时间:2024/04/28 08:10
接口是一个很广泛使用的概念,在 C++ 里面是纯虚函数,在JAVA里面就是interface,而在在brew里面也有类试的接口机制.
我们看一个最简单的写屏幕的例子.
IIMAGE_Draw(pImg, nPosX, nPosY);
在头文件里面找到,
#define IIMAGE_Draw(p,x,y) GET_PVTBL(p,IImage)->Draw(p,x,y)
其中GET_PVTBL 是一个宏,展开后可以看到
#define GET_PVTBL(p,iname) ((iname*)p)->pvt
其实就是把我们传进去的p,强转成IImage 指针, 所以
IIMAGE_Draw(pImg, nPosX, nPosY); 就可以等价于 ((IImage*)pImg)->pvt->Draw(p,x,y)
这个pvt又是什么呢,继续查看IImage指针的定义 typedef struct _IImage IImage ,IImage 是一个伪类型,那么_IImage的结构是怎样的.
在AEEIMage.h 这个头文件里面我们看到下面一些语句:
QINTERFACE(IImage)
{
DECLARE_IBASE(IImage)
void (*Draw)(IImage * po, int x, int y);
void (*DrawFrame)(IImage * po, int nFrame, int x, int y);
void (*GetInfo)(IImage * po, AEEImageInfo * pi);
void (*SetParm)(IImage * po, int nParm, int p1, int p2);
void (*Start)(IImage * po, int x, int y);
void (*Stop)(IImage * po);
// Extended methods...
void (*SetStream)(IImage * po, IAStream * ps);
boolean (*HandleEvent)(IImage * po, AEEEvent evt, uint16 wParam, uint32 dwParam);
void (*Notify)(IImage * po, PFNIMAGEINFO pfn, void * pUser);
};
QINTERFACE 也是一个宏(怎么这么多宏)
#define QINTERFACE(iname) /
struct _##iname {/
struct VTBL(iname) *pvt;/
};/
原来_IImage 的结构是在这里定义啊,它定义了一个pvt的指针,在上文用到,它指向的是一个虚表,而这个虚表就是一个结构体,
里面的内容就是下面的那些函数指针.而在IImage初使化的时候把对于的函数指针和实际的函数定义相关联,
所以在((IImage*)pImg)->pvt->Draw(p,x,y) 的时候实际上是调用了函数指针指向的Draw方法.
- brew 中的接口机制
- 深入BREW接口机制
- 深入BREW接口机制
- BREW抽象接口机制
- 深入BREW接口机制
- [深入分析BREW机制]:BREW接口的引用计数机制
- BREW中的日志接口功能
- BREW中的应用加载机制
- [深入分析BREW机制]:动手写BREW扩展接口
- [深入分析BREW机制]:BREW接口的继承特性应用
- [收录]深入BREW抽象接口机制
- 《深入brew接口机制》的补充
- BREW的事件机制,BREW中的设计模式
- BREW中的接口声明及使用
- BREW中的接口声明及使用
- BREW中的接口声明及使用
- BREW接口
- BREW接口
- ASP.NET编程中的十大技巧
- 下载文件出现提示框或者直接显示在浏览器中
- C++对象布局及多态实现探索之内存布局
- 如何在MySQL中获得更好的全文搜索结果
- 关于sizeof与strlen用法的讨论
- brew 中的接口机制
- linker与loader,x86与单片机
- pb的opensheet函数
- AJAX开发简略
- 使用Access的几点技巧
- Flv播放器
- prototype1.3.1源代码解读
- 新手谈对象内存布局与内存对齐[转]
- Hiberante的错误总结1