C++ c++;在使用侦听器时,什么样的设计有助于避免多重继承

C++ c++;在使用侦听器时,什么样的设计有助于避免多重继承,c++,C++,我有一个较大的项目,其中许多较小的类侦听一些数据,并在某些情况下通知其他类。所以我有这样的课程 class Calc {} class Spotter {} class Updater {} .... 还有一些听他们的课 class Listener_1 {} class Listener_2 {} 这个项目最终有很多接口 class ICalcListener { virtual void onCalcCall( ... ) {} class ISpotterListen

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

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.)std::函数 3.)lambda函数


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

从几个抽象类中只使用方法进行多重继承并没有那么糟糕,而且很有效。我同意它会产生大量“垃圾”代码来支持所有类型的通知

基本上,为每个事件使用
ixxnotify
抽象类更符合Java风格

我不知道你的项目是什么以及它是如何运作的,但你可以尝试寻找以下替代方案:

  • 坚持使用
    INotify
    抽象类,但要使其更通用,这样它们只有一个参数,如
    Event
    ,它将携带所有必需的信息,包括事件类型。这将减少接口类的数量,但会给事件类型的
    switch
    语句带来额外的麻烦。这种方法稍微打破了代码的“OOP性”

  • 制作一个通用事件/消息总线,在这里您将再次拥有对特定事件感兴趣的通用
    event
    参数和对象,可以订阅它们。看一看访客或观察者模式,并以更一般的方式思考它们

  • 使用
    std::function
    作为“事件处理程序”。这里的缺点是,您只能为任何给定事件分配一个处理程序。您可以通过在
    std::function
    的顶部添加一个层来克服这一问题

  • 看看现有的库,它们已经处理了这个问题,比如Qt或boost


  • 多接口继承并没有那么糟糕。数据继承带来了很多问题。谢谢,这是一个很好的概述。图书馆不是一个选择,因为我不能使用它们,但其他的看起来很有趣。这似乎是一个很好的参考,供任何人阅读模式和设计。