我有一个较大的项目,其中许多较小的类监听一些数据并在某些情况下通知其他类。所以我有类似的类(class)
class Calc {}
class Spotter {}
class Updater {}
....
和其他一些听他们的类
class Listener_1 {}
class Listener_2 {}
项目最终有很多接口(interface)
class ICalcListener {
virtual void onCalcCall( ... ) {}
class ISpotterListener {
virtual void on SpotterCall( ... ) {}
....
而且监听器并没有继承所有的监听器并在他们需要使用react的地方覆盖回调。
class Listener_1 : public ICalcListener, public ISpotterListener, ... {
virtual void onCalcCall( ... ) { doThis(); }
}
设计是可行的,但我想知道是否有比在这里最大程度地接口(interface)和继承自己更好的方法来处理这个问题。大多数情况下,我只需要注册一个回调。
编辑: 我正在四处寻找,似乎使用接口(interface)的替代方法正在使用(我正在使用 c11) 1.) 代表 2.) 标准::函数 3.) lambda 函数
如果性能很重要,但简单性也受到赞赏,那么最好的方法是什么?
最佳答案
从几个只有方法的抽象类的多重继承并没有那么糟糕,而且它是有效的。我同意它会产生大量“垃圾”代码来支持您拥有的所有类型的通知。
基本上,为每个事件使用 IXXXNotify
抽象类更符合 Java 风格。
我不确切知道你的项目是什么以及它是如何做的,但你可以尝试寻找这些替代方案:
坚持使用
INotify
抽象类,但使其更通用,因此它们将只有一个参数,如Event
,它将承载所有必需的信息,包括事件类型。这将减少接口(interface)类的数量,但会因事件类型上的switch
语句而带来额外的麻烦。这种方法稍微破坏了代码的“OOPness”。制作通用事件/消息总线,您将再次拥有通用
Event
参数和对特定事件感兴趣的对象可以订阅它们。查看访问者或观察者模式,并以更通用的方式思考它们。使用
std::function
作为您的“事件处理程序”。这里的缺点是您只能为任何给定事件分配一个处理程序。您可以通过在std::function
之上添加一个层来解决这个问题。查看已经处理此问题的现有库,例如 Qt 或 boost。
关于c++什么设计将有助于在使用监听器时避免多重继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42870661/