我有一个基类和从中派生的类。基类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/