C 中建立对象间消息连接的系统方法
2008-02-23 05:24:31来源:互联网 阅读 ()
大家都知道对象是数据和方法的封装体。在C 中,他们分别表现为数据成员和成员函数。程式设计者通过执行对象的各种方法,来改变对象的状态(即改变对象的属性数据)。从而使该对象发生某些“事件”。当一对象发生某事件时,他通常需向其他相关对象发送“消息”,请求他们作出一些处理。 这时,发生事件并向其他对象请求处理的对象被称为“事件对象”,而处理事件的对象被称为“回调对象”。回调对象对事件的处理称为“回调函数”。
在C 中,这一过程相当于:当事件对象发生事件时,调用回调对象的某些成员函数。通常的作法是回调对象向事件对象传递对象指针。但这种方法不通用。为了减少程式设计的工作量,本文提出一种建立对象间消息连接的系统方法。他的思路是:将“事件发生→请求处理→执行处理”这一过程抽象成一个“回调”(CallBack)类。通过继承,用户能够轻松获取建立对象间消息连接的机制。
一、回调类的数据结构及其成员函数
本文提出的CallBack类支持三种回调函数。他们是:回调对象中的成员函数,属于回调类的静态成员函数和普通的C函数。CallBackle类中包含一回调函数表callBackList。他用于记录事件名称,指向回调函数及回调对象的指针。该表的每一个节点为一个事件记录EventRecord。每个事件记录包含三个域:事件名指针eventName,指向回调对象的指针pointerToCBO,指向回调函数的指针pointerToCBF或pointerToCBSF(其中,pointerToCBF指向回调对象的成员函数,pointerToCBSF指向回调类的静态成员函数或普通函数。他们同处于一共用体内)。CallBack类所提供的回调机制是这样的:在事件对象上注册回调对象中的回调函数;当事件发生时,事件对象在其回调表中检索并执行回调函数。从而使二者的消息连接得以建立。(关于该类的具体实现,请参阅文后所附的程式清单) 回调对象
事件对象
事件名 回调对象指针 回调函数指针
“event” pointerCBO pointerToCBF或 pointerTOCBSF - - - - - - |
AddCallBack: 注册事件名和指向回调函数,回调对象的指针
CallCallBack: 在回调表中,检索注册在指定事件上回调函数并调用他们
事件发生时,调用CallCallBack函数
对事件event进行处理的成员函数
从CallBack类继承的回调表callBackList, 成员函数AddCallBack和CallCallBack。
当回调函数为静态成员函数或普通C函数时, pointerToCBO为NULL。
事件名是回调表callBackLis中的检索关键字。
回调对象中其他成员函数
CallBack类的成员函数AddCallBack用来将回调函数注册到事件对象的回调表中。他有两个重载版本:
void CallBack::AddCallBack(char *event,CallBackFunction cbf,CallBack *p); void CallBack::AddCallBack(char *event,CallBackStaticFunction cbsf); |
其中,第一个AddCallBack用来将某回调对象的成员函数注册到事件对象的回调表中。第二个AddCallBack用来将或某回调类的静态成员函数注册到事件对象的回调表中。在上参数表中,event是指向事件名字符串的指针,p是指向回调对象的指针,cbf和cbsf分别是指向成员函数及静态成员函数(或普通函数)的指针。当回调函数来自某回调对象SomeObject时,传递成员函数指针应采用如下格式:
(CallBackFunction)&SomeObject::MemberFunctionName; 传递SomeObject类的某静态成员函数指针应采用格式: (CallBackStaticFunction)& SomeObject::FunctionName;传递程式中普通函数指针时,只需传递函数名即可。 |
CallBack类的成员函数void CallBack::CallCallBack(char *ename, CallData calldata = NULL)用来调用注册在事件ename上的任何回调函数。其中,calldata为数据指针(CallData实际上就是void*,详见程式清单)。事件对象可通过他向回调对象传递有用的数据。该成员函数通常在事件对象的成员函数中调用,因为通常只有事件对象的成员函数才能改变对象的内部数据,从而使某些事件发生。
成员函数RemoveCallback用来删除注册在事件对象上的回调函数。他的三个重载版本依次为:
void CallBack::RemoveCallBack(char *event,CallBackFunction cbf,CallBack *p); void CallBack::RemoveCallBack(char *event,CallBackStaticFunction cbsf); void CallBack::RemoveCallBack(char *event); |
其中,event,cbf,cbsf,p等参数和成员函数AddCallBack中各参数相同。第一个RemoveCallBack用于删除注册在事件event上某回调对象的一个成员函数。第二个RemoveCallBack用于删除注册在事件event上的某普通函数或某回调类的一个静态成员函数。第三个RemoveCallBack用于删除注册在事件event上的全部回调函数。
二、CallBack类的使用方法
使用CallBack类,可按以下步骤进行:
1.确定程式中哪些对象间存在关系,需要建立消息连接。并确定在各特定消息连接关系中,哪个对象是事件对象,哪个对象是回调对象。
2.事件对象类和回调对象类都必须从CallBack类继承,以获得回调支持。
3.为事件对象注册回调数据。包括:事件名,回调函数名,指向回调对象的指针。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇: 谈跨平台C 动态连接库的实现
下一篇: C 操作符重载的变态用途之子类转换
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash