用面向对象的方法替代回调函数
凌丽软件工作室 http://china.wosens.net
编写:梅文海
2006.3.28
2006.4.5 日编写示例
在 VC 中,为了降低各模块之间的偶合,常常采用回调函数,即只需要在目标代码中定义一个函数指针即可调用原模块的代码,但是回调函数一般都采用静态的方式,如果这样的函数规模比较小问题还不大,但是如果静态的东西多了就会导致占用内存过多的问题。
回调示例如下:(该示例仅用来演示回调的用法,更详细的线程定时器代码见附件 Demo)
一、回调模块:
1.定义回调函数指针类型
typedef void (*CTimeCallback)(void);
2.编写回调模块类
class CMyTimer{
private:
CTimeCallback m_pCallback;
public:
CMyTime(CTimeCallback ATimeCallback);
void OnTimer();
}
CMyTimer::CMyTimer(CTimeCallback ATimeCallback)
{
m_pCallback=ATimeCallback;
}
void CMyTime::OnTimer()
{
if(m_pCallback) m_pCallback();
Sleep(2000);
}
二、调用模块:
1.定义一个用于回调的静态函数
class CMainView:public CFormView{
CMyTimer* pTim;
static void OnTimerCallback();
...
}
2.注册回调函数
void CMainView::OnShowWindow(BOOL bShow, UINT nStatus){
pTim=new CMyTimer(OnTimerCallback);
}
3.编写回调函数的代码
void CMainView::OnTimerCallback()
{
AfxMessageBox("调用成功!");
}
下面我们改用面向对象的方法来解决这个问题,这个才叫经典,用接口就解决了问题。
一、定义一个接口
如下:
class CTimerInterfaceBase{
public:
virtual void OnTimer()=NULL;
};
二、在回调模块编写如下代码,包括接口的实现
class CMyTimer
{
private:
CTimerInterfaceBase* m_pTimer;
public:
CMyTime(CTimerInterfaceBase* ATimer);
void OnTimer(){
if(m_pTimer) m_pTimer->OnTimer();
Sleep(2000);
};
}
CMyTimer::CMyTimer(CTimerInterfaceBase* ATimer)
{
m_pTimer=ATimer;
}
三、调用模块
class CMainView:public CFormView,CTimerInterfaceBase{
void OnTimer();
...
}
// 这个相当于注册回调函数
void CMainView::OnShowWindow(BOOL bShow, UINT nStatus){
pTim=new CMyTimer(this);
}
// 这个相当于回调函数
void CMainView::OnTimer(){
AfxMessageBox("调用成功!");
}
上面采用多重继承来实现,充分展示了 C++ 语言的面向对象的特性,如果不用多重继承也可以解决问题,不过会显得比较罗嗦。