【问题标题】:Hierarchy inheritance层次继承
【发布时间】:2010-11-10 11:47:32
【问题描述】:

我遇到了这个问题。在我的 C++ 层次结构树中,我有两个用于不同性质但行为相同的实体的分支 - 相同的接口。我创建了这样的层次结构树(下图中的第一个)。 现在我想独立于它们的性质(第一或第二)使用 Item 或 Base 类。然后我为此用途创建了一个抽象分支。我的思想建立(下图中的第二个)。 但它不起作用。工作方案似乎(下图中的第三个)。 逻辑不好,我觉得... 有人对这种层次结构继承有一些想法吗?如何让它更符合逻辑?更简单易懂?

Image

对不起我的英语 - 俄罗斯互联网没有帮助:)

更新: 你要求我更明确,我会的。

在我的项目(Adobe Framemaker 插件)中,我需要使用对话框和 GUI 控件。在某些地方我使用 WinAPI 控件,而在其他一些地方使用 FDK(内部 Framemaker)控件,但我想使用相同的界面。

我不能使用一个基类并从它继承其他基类,因为所有需要的控件 - 是一个层次结构树(不是一个类)。

所以我有一个用于 WinAPI 控件的层次结构树、一个用于 FDK 和一个用于使用任何控件的抽象树。

比如有一个Edit控件(WinEdit和FdkEdit实现),一个Button控件(WinButton和FdkButton实现)和基础实体——Control(WinControl和FdkControl实现)。

现在我可以将实现树(Win 和 Fdk)中的类与它们之间的继承联系起来(WinControl 是 WinButton 和 WinEdit 的基类;FdkControl 是 FdkButton 和 FdkEdit 的基类)。我可以链接到抽象类(Control 是 WinControl 和 FdkControl 的基类;Edit 是 WinEdit 和 FdkEdit 的基类;Button 是 WinButton 和 FdkButton 的基类)。但我无法链接我的抽象树 - 编译器发誓。

事实上,我有两个层次树,我想从另一个继承。

更新:
我已经完成了这个任务! :)
我使用了虚拟继承并得到了这样的方案(http://img12.imageshack.us/img12/7782/99614779.png)。抽象树只有绝对抽象方法。抽象树中的所有继承都是虚拟的。从实现树到抽象的链接是虚拟的。为简单起见,在图像上仅显示了一个实现树。
感谢您的帮助!

【问题讨论】:

  • 这将有助于查看有意义的名称,而不是 FirstBaseFirstItemSecondBase 等。
  • 拥有“AbstractItem”的原因是什么?为什么不只是有一个“AbstractBase”类,不仅是 FirstBase 和 SecondBase,而且是 FirstItem 和 SecondItem 的公共锚点?
  • 如果您的实体具有相同的行为和相同的界面,它们应该属于同一类。
  • 你不能抽象地设计。设计合理的层次结构的唯一方法是了解类,以及它们做什么。而你没有告诉我们,所以我们不可能帮助你。

标签: c++ oop inheritance tree hierarchy


【解决方案1】:

C++ 支持多重继承,因此您可以拥有 (2) 和 (3) 的并集,确保 AbstractBase 始终声明为虚拟基类。

在不了解各种课程的真正含义和目的的情况下,很难提供更好的建议。

【讨论】:

    【解决方案2】:

    从描述中不清楚这是否适合您,但通常具有公共接口的类会在AbstractBase 中定义接口,然后让具体实例直接从该接口继承(FirstItemSecondItem)。

    为什么在您的示例中使用了额外的间接性? AbstractItemFirstBaseSecondBase 中的预期内容是什么?

    【讨论】:

      【解决方案3】:

      对于使用一个接口的不同实现,可以使用: the Bridge Design Pattern

      您可以将此与工厂设计模式结合起来,以便以不同的方式构建您的两个实现。

      但是,对于您的类架构而言,它可能看起来太简单了。

      但正如您回答中的 cmets 所说:很难想象您的班级具有这样的名称的工作/角色。你应该更明确,这样我们才能想到一个精确的设计。

      【讨论】:

        猜你喜欢
        • 2013-06-16
        • 1970-01-01
        • 2011-06-16
        • 2014-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-06
        • 2016-11-03
        相关资源
        最近更新 更多