【发布时间】:2017-10-18 10:36:18
【问题描述】:
我有以下问题: 我想让多个 Windows 都显示某种功能图。假设一个窗口应显示坐标轴并具有一些交互功能,另一个窗口也应显示坐标轴并具有设置对话框。
我如何直观地做到这一点,是将Window 实现为使用我的框架(在我的情况下为VTK)初始化基本窗口的一些类,一些虚拟继承类WindowWithAxis,WindowInteracting, WindowWithSettingsDialog 然后有
- 类
A继承WindowInteracting和WindowCoordinateAxis - 类
B继承WindowWithSettingsDialog和WindowCoordinateAxis
因此,通过互联网阅读我现在到处都可以看到(例如 Google 样式指南),只有当 Window、WindowInteracting、WindowCoordinateAxis、WindowWithSettingsDialog 都是纯抽象类/接口时,我才应该这样做.
这是我不明白的。这是否意味着不允许我实际实现这些类,并且我必须在类A 和类B 中实现Window 和WindowCoordinateAxis 的所有功能(以及所有其他类)使用这些)?这对我来说似乎不是一个干净的解决方案。
这种“菱形继承”应该是经常出现的问题,请问有什么方法可以解决呢?
【问题讨论】:
-
我不会将窗口用作具有坐标轴的窗口的基类,而是使用合成。只要您想在同一个窗口中拥有 2 个坐标轴,您的设计就会变得复杂(而原则上它应该很容易)
-
IMO 它不会只保留
WindowWithAxis、WindowInteracting和WindowWithSettingsDialog。你很快就会拥有WindowWithButton、WindowWith2Axis、WindowWithScrollbar,你的类将是一团不可改变的代码,因为一切都与一切相关,如果没有完全重新设计,就不可能做任何事情。坚持只使用Window并创建一个Axis这是一个Window并创建它以便您可以将Windows 添加到其他Windows。或者只是将 Qt 与 QWT 一起使用,它已经为您解决了所有这些问题。 -
@Rosme 在引用其他网站时,指出cross-posting is frowned upon 通常会有所帮助
-
人们警告不要使用多重继承的真正原因是,这种方法通过继承它需要做的所有事情来拼凑一个全能对象,如果它很难维护,并且使得重用代码更加困难从长远来看。
标签: c++ oop inheritance design-patterns