C ++什么设计将有助于避免使用侦听器时的多重继承
c++ what design will help avoid multiple inheritance when using listeners
我有一个更大的项目,其中许多较小的类侦听一些数据,并在某些情况下通知其他类。所以我有这样的课程
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风格。
我不知道你的项目到底是什么,它是如何工作的,但你可以尝试寻找这些替代方案:
-
坚持使用
INotify
抽象类,但使其更通用,因此它们只有一个参数,如Event
,它将携带所有必需的信息,包括事件类型。这将减少接口类的数量,但会给事件类型的switch
语句带来额外的麻烦。这种方法会稍微破坏代码的"OOPness"。 -
创建一个通用事件/消息总线,其中您将再次拥有通用
Event
参数和对象,对特定事件感兴趣的对象可以订阅它们。看看访客或观察者的模式,并以更通用的方式思考它们。 -
使用
std::function
作为"事件处理程序"。这里的缺点是只能将一个处理程序分配给任何给定事件。您可以通过在std::function
之上添加一层来克服这一点。 -
看看已经处理这个问题的现有库,比如Qt或boost。
相关文章:
- 如何在没有侦听器的情况下创建 TCP 连接?
- glfw 的基本设置会导致与 emscripten 生成的 js 文件中的事件侦听器有关的运行时错误
- 如何通知侦听器结构的哪个字段已更新
- 通过TCP连接到Wi-Fi上的0.0.0.0,而侦听器PC有活动的Wi-Fi,以太网没有'不起作用
- 如何提高对 std::函数侦听器的分发性能?
- 如何在 TCP 侦听器中处理异步发送和接收
- 从侦听器检索 antlr4 解析器中跳过的空格
- 为什么日食总是发生错误"An internal error occurred during: "通知选择侦听器". java.lang.StackOverflowError"
- 超越Juce ButtonStateChange /侦听器问题
- 微控制器 - 按钮"按住"侦听器
- 从 Objective-c 委派到 c(或者更好地称之为:创建从 C 到 OBJ-C 的侦听器)
- 如何使用 Node.js 开发一个侦听器来接收许多车辆跟踪数据(通过 TCP)
- C++ 套接字侦听器 accept() 在发布时不接受连接请求
- C ++什么设计将有助于避免使用侦听器时的多重继承
- RDP动态虚拟通道 - 创建多个侦听器
- VS2015 中卡萨布兰卡的链接器错误,同时尝试构建一个简单的 HTTP 侦听器
- 侦听器.Accept将错误传递给sf :: tcpsocket时给出错误
- 如何使侦听器可以访问C 中的其他功能
- C++11观察者模式(信号、插槽、事件、更改广播器/侦听器,或任何您想称之为的东西)
- C++ 函数调用侦听器