我曾經遇到過這個問題。在我的C++層次結構樹中,我有兩個分支用於差異性實體,但具有相同的行爲 - 相同的接口。我創建了這樣的層次結構樹(首先在下圖中)。 現在我想要獨立處理Item或Base類的性質(第一或第二)。然後我爲此使用創建一個抽象分支。我的思維構建(下圖中的第二個)。 但它不工作。工作計劃似乎(下圖中的第三個)。 這是不好的邏輯,我認爲... 有沒有人有關於這種層次繼承的一些想法?如何使它更符合邏輯?更容易理解?層次繼承
對不起,我的英語 - 俄語互聯網沒有幫助:)
更新: 你問我要更加明確,我會。
在我的項目(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)。抽象樹只有絕對的抽象方法。抽象樹中的所有繼承都是虛擬的。從實現樹到抽象的鏈接是虛擬的。在圖像上爲簡單起見,只顯示了一個實現樹。
感謝您的幫助!
這將有助於看到有意義的名稱,而不是'FirstBase','FirstItem','SecondBase'等。 – 2010-11-10 11:55:02
有什麼理由讓「AbstractItem」?爲什麼不只有一個「AbstractBase」類,不僅是FirstBase和SecondBase的共同支持者,還是FirstItem和SecondItem的共同支持者? – 2010-11-10 11:55:02
如果您的實體具有*相同的行爲和相同的接口*,則它們應該屬於同一類。 – 2010-11-10 11:58:36