您的位置:首页 > 其它

brew 中的接口机制

2006-12-21 14:31 330 查看
接口是一个很广泛使用的概念,在 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方法.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: