2011-11-28 34 views
1

我需要模仿Java中的多繼承。這可能是錯誤的設計,但是,因爲我的問題不是(父級)類功能,所以我一直無法模擬接口的功能。 下面是對問題的更多描述。 我有一個叫做AbstractModel.java的類,有很多方法。另一方面,還有另一類AbstractTableModel.java。現在假設有一個名爲table controller.java的類處理AbstractModel.java,另一方面有一個名爲Tableview .java的類處理AbstractTableModel.java。我需要一些方法來定義:公共類A延伸AbstractModel,AbstracTableModel,以便視圖和控制器可以使用擴展名相同的類。請注意,解決方案AbstractTableModel.java擴展爲AbstractModel不是一個解決方案,因爲它是一個內置的java類。如何在接口中使用java實現多繼承?

謝謝。

+1

難道你不能製作AbstractModel和AstractTableModel接口,然後讓類A實現這些接口嗎? – Asterisk

+0

另請參見['SharedModel']的此示例(http://stackoverflow.com/a/7572903/230513)。 – trashgod

+0

您可以將1個類:AbstractModel類或AstractTableModel類轉換爲接口,然後A類擴展1個類並實現剩餘的接口。 – Thinhbk

回答

1

你不能直接使用Java,但可以使用delegation design pattern。看看here。這是一個非常類似的問題。

+0

hanks @gigadot我想我的問題還不夠清楚。正如我之前提到的,我的問題不是功能。總結:有一種方法可以使用AbstracttableModel。即顯示(AbstractTableModel模型),並且在控制器中存在接受抽象模型即addModel(AbstractModel模型)的方法。現在,我可以如何將相同的模型添加到控制器並在沒有多重繼承的情況下顯示在視圖上?我想到的一種方法是創建第二個類,它有兩個成員:AbstractModel AM,AbstracTableModel ATM和Pass AM到控制器和ATM到視圖 – Hasti

+0

不可能創建一個新的類,該類繼承AbstractModel和AbstracTableModel 。如果你想改變你的控制器和查看方法的簽名,就像你所描述的接受這個新類一樣,你最好重新設計你的模型表示。 – gigadot

+0

你是否知道任何特殊的設計模式,除了委託設計模式之外的其他所有功能? – Hasti

0

更改代碼,預計一個AbstractTableModel,使其接受TableModel而不是(這是由AbstractTableModel實現的接口)。無論如何,這應該完成。當你可以依賴一個接口時,永遠不要依賴具體的實現。

然後你可以很容易地讓類AbstractModel實施TableModel

你也應該考慮爲AbstractModel創建一個接口。通常人們會創建一個接口X,抽象基實現AbstractX它提供了所有實現共同的功能,並實現MyXYourX等,只有具體實現(但不是他們的必然全部)都知道,依靠AbstractX,但沒有此層次結構外的代碼。

Java集合框架就是一個很好的例子:有例如ListAbstractListArrayListLinkedList,但沒有代碼,實際上依賴於AbstractList。列表中的大多數用戶只是使用任何List,或者由於某種原因需要具體實現時,他們依賴於此。

+0

我不認爲'List'和'AbstractList'在這裏是一個很好的比較。後者除了從接口繼承的方法外,沒有其他的公共方法,而'AbstractTableModel'從TableModel繼承少於一半的公共方法。另外,我看到很多擴展AbstractTableModel的類,但只有兩個直接實現了TableModel(在第三方庫中),所以實際上有很多代碼取決於這個實現,而不是接口。 –