我有一个基类和派生自它的类。基类 Controllable
充当输入循环的接口(interface),其他类从它派生以在该循环中获得一个位置以获取事件,例如按下某个键。
class Controllable{
public:
virtual void setActive(bool state) { m_active = state; }
virtual void input(Event & e) =0;
private:
bool m_active;
};
class Button : public Controllable{
public:
void setActive(bool state){ /*do extra work*/ m_active = state; }
void input(Event & e) override;
};
由于 Button
类处理事件队列中的事件,将其设置为非事件状态(将其从输入循环中取出)可能会导致它错过重要事件,例如未按下某个键,因此如果以后再次激活,它需要额外的代码才能将其置于友好的非事件状态。
我的问题,确保 setActive
始终具有将 m_active
切换到正确状态的预期效果的最佳方法是什么,而同时,不需要派生类来定义它,除非它们需要附加额外需要的代码?
最佳答案
保持 setActive
方法为非虚方法,然后定义一个单独的 protected
方法 activeChanged
子类可以覆盖
class Controllable{
public:
void setActive(bool state) { m_active = state; activeChanged(state); }
virtual void input(Event & e) = 0;
protected:
virtual void activeChanged(bool newState) {}
private:
bool m_active;
}
class Button : public Controllable{
protected:
void activeChanged(bool newState){ /*do extra work*/ }
public:
void input(Event & e);
};
通过这种方法,您可以将外部公共(public) 接口(interface)与用于子类的内部 protected 接口(interface)分开。
关于C++:需要调用相同代码的虚函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8793110/