在继承的接口中调用自定义代码?

时间:2012-12-13 03:10:30

标签: c++ interface

我如何调用类外部的自定义代码,但是从具体对象中调用?例如。如果我想更改类外部的对象或变量的状态?函子?回调?

我是否需要在界面或ADT中存储仿函数或回调?...假设使用仿函数或回调是我应该做的...

修改

在与Functors和模板定义作战之后,我整天都回到使用函数指针。现在,用户所做的就是注册先前定义的函数名称并调用它。由于成员变量默认为nullptr,如果它们没有注册一个,则除了默认行为之外没有任何反应。请参阅下面的编辑代码。

按钮界面:

class IButton {

public:
    virtual void OnPress() = 0;
    virtual void OnRelease() = 0;
    virtual void OnHover() = 0;
protected:
private:

};

按钮ADT:

#include "IButton.h"
//..More includes

class ADTButton : public IButton {

public:

    //..Other methods...

    virtual void OnRelease()=0;
    virtual void OnPress()=0;
    virtual void OnHover()=0;

    virtual void OnRelease(ADTButton* btn);
    virtual void OnPress(ADTButton* btn);
    virtual void OnHover(ADTButton* btn);

    virtual void RegisterOnReleaseCallback(void (*OnReleaseCallBack)(ADTButton* btn));
    virtual void RegisterOnPressCallback(void (*OnPressCallBack)(ADTButton* btn));
    virtual void RegisterOnHoverCallback(void (*OnHoverCallBack)(ADTButton* btn));

protected:

    void (*_OnRelease)(ADTButton* btn);
    void (*_OnPress)(ADTButton* btn);
    void (*_OnHover)(ADTButton* btn);


    //..More Stuff Here in various access modifiers

};

具体按钮标题:

class CpuButton : public ADTButton {
public:

    CpuButton();
    virtual ~CpuButton();

    virtual void OnRelease();
    virtual void OnPress();
    virtual void OnHover();

protected:
private:
};

具体按钮实施:

#include "BTN_CPU.h"

void CpuButton::OnRelease() {
    ADTButton::OnRelease();
    if(this->_OnRelease) this->_OnRelease(this);
}

void CpuButton::OnPress() {
    ADTButton::OnPress();
    if(this->_OnPress) this->_OnPress(this);
}

void CpuButton::OnHover() {
    ADTButton::OnHover();
    if(this->_OnHover) this->_OnHover(this);
}

1 个答案:

答案 0 :(得分:1)

您可以拥有另一个接口,该接口根据其自身的具体实现提供各种行为,并通过指向存储为成员变量的具体实现的指针来调用此接口的方法。这当然是回调。您还可以使用策略模板在编译时执行此操作。