层次结构继承

时间:2010-11-10 11:47:33

标签: c++ oop inheritance tree hierarchy

我遇到了这个问题。在我的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)。抽象树只有绝对的抽象方法。抽象树中的所有继承都是虚拟的。从实现树到抽象的链接是虚拟的。在图像上只显示了一个简化的实现树 谢谢你的帮助!

3 个答案:

答案 0 :(得分:0)

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

如果不了解各个班级的真正含义和目的,就很难提供更好的建议。

答案 1 :(得分:0)

从描述中不清楚这是否适合您,但通常具有通用接口的类将在AbstractBase中定义接口,然后具体实例直接从该接口继承(FirstItem,{{ 1}})。

为什么你的例子中有额外的间接?预期SecondItemAbstractItemFirstBase会发生什么?

答案 2 :(得分:0)

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

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

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

但正如你的答案中的评论所说:很难想象你的班级的职位/角色有这样的名字。你应该更明确,因为我们可以想到一个精确的设计。