2010-11-10 200 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

你可能還有一點,一個工廠設計模式,從而來構建你的兩種實現方式不同。

但是,對於您的類架構而言,它可能看起來過於簡單。

但是正如你在答案中的評論所說:很難想象你的班級有這樣的名字的工作/角色。你應該更加明確,因爲我們可以考慮一個精確的設計。