【发布时间】:2010-11-10 11:47:32
【问题描述】:
我遇到了这个问题。在我的 C++ 层次结构树中,我有两个用于不同性质但行为相同的实体的分支 - 相同的接口。我创建了这样的层次结构树(下图中的第一个)。 现在我想独立于它们的性质(第一或第二)使用 Item 或 Base 类。然后我为此用途创建了一个抽象分支。我的思想建立(下图中的第二个)。 但它不起作用。工作方案似乎(下图中的第三个)。 逻辑不好,我觉得... 有人对这种层次结构继承有一些想法吗?如何让它更符合逻辑?更简单易懂?
对不起我的英语 - 俄罗斯互联网没有帮助:)
更新: 你要求我更明确,我会的。
在我的项目(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)。抽象树只有绝对抽象方法。抽象树中的所有继承都是虚拟的。从实现树到抽象的链接是虚拟的。为简单起见,在图像上仅显示了一个实现树。
感谢您的帮助!
【问题讨论】:
-
这将有助于查看有意义的名称,而不是
FirstBase、FirstItem、SecondBase等。 -
拥有“AbstractItem”的原因是什么?为什么不只是有一个“AbstractBase”类,不仅是 FirstBase 和 SecondBase,而且是 FirstItem 和 SecondItem 的公共锚点?
-
如果您的实体具有相同的行为和相同的界面,它们应该属于同一类。
-
你不能抽象地设计。设计合理的层次结构的唯一方法是了解类是,以及它们做什么。而你没有告诉我们,所以我们不可能帮助你。
标签: c++ oop inheritance tree hierarchy