gpt4 book ai didi

c++ - 来自多个类的虚拟事件处理程序 : multiple inheritance or composition?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:30:55 25 4
gpt4 key购买 nike

我的团队编写了几个通过纯虚拟回调实现事件处理的 C++ 类 - 例如,当从另一个进程接收到消息时,处理 IPC 消息传递的基类调用它自己的纯虚函数,派生类处理覆盖该函数的事件。基类知道事件已经发生;派生类知道如何处理它。

我现在想将这些基类提供的功能组合到一个更高级别的类中,例如,当一条消息从另一个进程到达时,我的新类可以使用类似的事件通过其网络连接转发它-驱动网络类。看起来我有两个选择:

  • (1) 组合:从每个事件处理基类派生类,并将这些派生类的对象作为成员添加到我的新类中,或者:

  • (2) 多重继承:使我的新类成为所有事件处理基类的派生类。

我已经尝试了 (1) 和 (2),但我对其中任何一个的实现都不满意。

还有一个额外的复杂性:一些基类是使用初始化和关闭方法而不是使用构造函数和析构函数编写的,当然这些方法在每个类中具有相同的名称。所以多重继承导致函数名歧义。可以通过 using 声明和/或显式范围界定来解决,但不是我见过的最易于维护的东西。

即使没有这个问题,使用多重继承并覆盖几个基类中每一个的每个纯虚函数也会使我的新类变得非常大,接近于“上帝对象”。随着需求的变化(阅读:“随着需求的增加”),这不会很好地扩展。

另一方面,使用单独的派生类并将它们添加为我的新类的成员意味着我必须在每个派生类上编写大量方法以在它们之间交换信息。这感觉非常像“getters 和 setters”——没那么糟糕,但是有很多“从那个类获取信息并将其传递给这个类”,这给人一种低效的感觉——很多额外的方法,很多额外的读取和写入,并且这些类必须了解很多彼此的逻辑,这感觉不对。我认为成熟的发布和订阅模型有点矫枉过正,但我​​还没有找到一个简单的替代方案。

如果我使用组合,也会有很多重复的数据。例如,如果我的类的状态取决于它的网络连接是否已启动并正在运行,我必须在受此影响的每个类中都有一个状态标志,或者让每个类在每次需要决策时查询网络类的状态制作。如果我只有一个多重继承的类,我可以只使用一个标志,我的类中的任何代码都可以访问该标志。

那么,多重继承、组合,或者完全是其他东西?是否有关于如何最好地处理此类事情的一般经验法则?

最佳答案

根据你的描述,我认为你已经采用了“模板方法”风格的方法,其中基础确实起作用,然后调用派生类实现的纯虚拟而不是几乎相同的“回调接口(interface)”方法除了纯虚方法位于一个完全独立的接口(interface)上,该接口(interface)作为构造函数的参数传递给“基”。我个人更喜欢后者,因为我发现在将对象插入到一起并构建更高级别的对象时它更加灵活。

我倾向于使用实现组合对象所需的回调接口(interface)的组合类进行组合,然后可能在更高级别以类似的样式再次组合。

然后您可以通过让组合对象实现回调接口(interface)并将它们传递给构造函数中的“组合”对象来决定是否适合组合,或者您可以在其自己的对象中实现回调接口(interface),可能更简单您的组合对象实现的更精确的回调接口(interface),并组合“基础对象”和“回调实现对象”...

就我个人而言,我不会使用“抽象事件处理”接口(interface),因为我更喜欢我的代码是明确和清晰的,即使这会导致它稍微不那么通用。

关于c++ - 来自多个类的虚拟事件处理程序 : multiple inheritance or composition?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12296188/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com