C ++什么设计将有助于避免使用侦听器时的多重继承

c++ what design will help avoid multiple inheritance when using listeners

本文关键字:侦听器 多重继承 什么 有助于      更新时间:2023-10-16

我有一个更大的项目,其中许多较小的类侦听一些数据,并在某些情况下通知其他类。所以我有这样的课程

class Calc {}
class Spotter {}
class Updater {}
....

和其他一些听他们的课程

class Listener_1 {}
class Listener_2 {}

该项目最终有许多接口

class ICalcListener {
virtual void onCalcCall( ... ) {}
class ISpotterListener {
virtual void on SpotterCall( ... ) {}
....

并且侦听器不会继承所有侦听器并覆盖它们需要做出反应的回调。

class Listener_1 : public ICalcListener, public ISpotterListener, ... {
virtual void onCalcCall( ... ) { doThis(); }
}

设计正在发挥作用,但我想知道是否有比在这里最大限度地连接和继承自己更好的方法来解决这个问题。大多数情况下,我所需要的只是注册回调。

编辑: 我正在闲逛,似乎使用接口的替代方案是使用(我正在使用 c11) 1.) 代表 2.) 标准::功能 3.) λ函数

如果性能很重要,但简单性也值得赞赏,那么最好的方法是什么?

仅使用方法从多个抽象类进行多重继承并不是那么糟糕,而且它有效。我同意它会产生很多"垃圾"代码来支持您拥有的所有类型的通知。

基本上,为每个事件IXXXNotify抽象类更像Java风格。

我不知道你的项目到底是什么,它是如何工作的,但你可以尝试寻找这些替代方案:

  1. 坚持使用INotify抽象类,但使其更通用,因此它们只有一个参数,如Event,它将携带所有必需的信息,包括事件类型。这将减少接口类的数量,但会给事件类型的switch语句带来额外的麻烦。这种方法会稍微破坏代码的"OOPness"。

  2. 创建一个通用事件/消息总线,其中您将再次拥有通用Event参数和对象,对特定事件感兴趣的对象可以订阅它们。看看访客或观察者的模式,并以更通用的方式思考它们。

  3. 使用std::function作为"事件处理程序"。这里的缺点是只能将一个处理程序分配给任何给定事件。您可以通过在std::function之上添加一层来克服这一点。

  4. 看看已经处理这个问题的现有库,比如Qt或boost。