c++什么设计将有助于在使用监听器时避免多重继承

标签 c++

我有一个较大的项目,其中许多较小的类监听一些数据并在某些情况下通知其他类。所以我有类似的类(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 风格。

我不确切知道你的项目是什么以及它是如何做的,但你可以尝试寻找这些替代方案:

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

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

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

  4. 查看已经处理此问题的现有库,例如 Qt 或 boost。

关于c++什么设计将有助于在使用监听器时避免多重继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42870661/

相关文章:

c++ - 为什么 std::ostream 的构造函数受到保护?

c++ - 从网络摄像头预览捕获图像的最佳 DirectShow 方式? SampleGrabber 已弃用

c++ - 逐行读取 QString 的最佳方法

C++逐行读取文件的最快方法

c++ - `>>>` 如何在 C++0x 中进行词法分析?

c++ - 如何在C++中捕获多个信号?

c++ - 如何编写通用的独立于编译器的代码?

c++ - Boost::msm 如何使用非默认构造函数初始化 state_machine_def 和 msm::front::state

c++ - 在命名线程后附加调试器时, native C++ 线程名称不会显示在 visual studio 线程窗口中

c++ - 从位字段中存储和检索带符号的值