2016-09-26 233 views
0

我有下面的類結構(布拉赫=== ExtBlah):多重繼承的分類?

Base 
+--[ ExtBase ] --???-- [ ExtBlah ] --- .. more scripts ... 
+--[ Blah ] 
     +---[ Script1 ] 
     +---[ Script2 ] 
     +---[ ....... ] 
     +---[ ScriptN ]  

現在我需要寫更多的腳本,需要延長鬍說,而是布拉赫具有延長「ExtBase」,而不是「基地」爲新的劇本案件。

我仍然需要Blah,因爲Scripts1-N必須依賴於「Base」,而不是「ExtBase」。

另外我不想創建Blah的副本,即ExtBlah,因爲這意味着代碼重複,並且會更難以支持。

任何想法?

+2

將一個Blah嵌入到ExtBlah中使其成爲一個適配器 –

+1

是的,這裏有一個[Delegation Pattern](https://en.wikipedia.org/wiki/Delegation_pattern)。如果您使用的是NetBeans的'Alt-Ins',將會出現一個菜單,允許自動生成方法。 – markspace

+1

另外,Java沒有「腳本」,所以請不要稱它們爲「腳本」。可能你的意思是類,但「源文件」和「編譯單元」也可能是合適的。 – markspace

回答

0

我也有基本& ExtBase已經初始化例程的併發症,準備DB連接和其他東西阻止我從實例多個實例基地繼承。

這是我做的。

創建一個單獨的util狀類BaseUtil然後在布拉赫& ExtBlah推翻的init()是這樣的:

@Override 
public void init() { 
    super.init(); 
    util = new BaseUtil(this.shared1, this.shared2, ....); 
} 

/現在布拉赫延伸基地ExtBlah延伸ExtBase和BaseUtil包含所有共享的功能性,但仍可以像Base一樣行爲,因爲我傳遞了所有的共享屬性,而不需要調用init()兩次。

所以這個想法是創建一個對象的實例,它保存所有的共享功能,即不復制代碼,而是複製屬性。 BaseUtil不在層次結構中。

PS>如果您有太多共享屬性,這可能會很尷尬。 另外,如果您不想將原始腳本更改爲使用「util.method()」,則可以委派所有方法。

1

正如Jean-Baptiste在他的評論中所說的,如果你不想重複Blah的代碼,將它封裝到ExtBlah中並調用Blah的方法。請記住添加一個通用界面。事實上,接口試圖解決一些多重繼承問題。

Base 
+--[ ExtBase ] 
+--[ Blah ] implements BlahInterface 
     +---[ Script1 ] 
     +---[ Script2 ] 
     +---[ ....... ] 
     +---[ ScriptN ] 
+--[ ExtBlah: - private Blah instance] implements BlahInterface 
     +---[ ScriptK ] 
+0

有一個複雜因素,因爲Base&ExtBase具有在初始化/構造上運行的代碼。如果你說我必須有私人實例,這意味着我會有兩個初始化運行,這是icky。但是這給了我一些想法 – user1019129

+0

如果有可能嘗試將Base包裝到[singleton](https://en.wikipedia.org/wiki/Singleton_pattern)類中。通過這種方式,您只能將類Blah實例化一次。 – fusiled