2010-11-10 117 views
0

我曾经遇到过这个问题。在我的C++层次结构树中,我有两个分支用于差异性实体,但具有相同的行为 - 相同的接口。我创建了这样的层次结构树(首先在下图中)。 现在我想要独立处理Item或Base类的性质(第一或第二)。然后我为此使用创建一个抽象分支。我的思维构建(下图中的第二个)。 但它不工作。工作计划似乎(下图中的第三个)。 这是不好的逻辑,我认为... 有没有人有关于这种层次继承的一些想法?如何使它更符合逻辑?更容易理解?层次继承

Image

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

更新: 你问我要更加明确,我会。

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

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

所以我有一个用于WinAPI控件的层次结构树,一个用于FDK和一个抽象树来使用任何控件。例如,有一个Edit控件(WinEdit和FdkEdit实现),一个Button控件(WinButton和FdkButton实现)和基本实体 - 控件(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)。抽象树只有绝对的抽象方法。抽象树中的所有继承都是虚拟的。从实现树到抽象的链接是虚拟的。在图像上为简单起见,只显示了一个实现树。
感谢您的帮助!

+0

这将有助于看到有意义的名称,而不是'FirstBase','FirstItem','SecondBase'等。 – 2010-11-10 11:55:02

+1

有什么理由让“AbstractItem”?为什么不只有一个“AbstractBase”类,不仅是FirstBase和SecondBase的共同支持者,还是FirstItem和SecondItem的共同支持者? – 2010-11-10 11:55:02

+3

如果您的实体具有*相同的行为和相同的接口*,则它们应该属于同一类。 – 2010-11-10 11:58:36

回答

0

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

不知道各类的真正意义和目的,很难提供更好的建议。

0

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

为什么在你的例子中额外的间接性?预计将在AbstractItem,FirstBaseSecondBase

0

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

你可能还有一点,一个工厂设计模式,从而来构建你的两种实现方式不同。

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

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