用面向对象的方法替代回调函数

用面向对象的方法替代回调函数

凌丽软件工作室 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++ 语言的面向对象的特性,如果不用多重继承也可以解决问题,不过会显得比较罗嗦。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值