brew 中的接口机制

接口是一个很广泛使用的概念,在 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方法.


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值