2013-07-05 100 views
0

我想知道是否有任何「乾淨」的方式來實現整個類層次結構中的可選變量,而不必簡​​單地將它留空和空檢查所有的時間。假設我有以下抽象父類:Java類層次結構,如何實現整個可選變量

public abstract class Item { 

public String name; 

public Item(String name){ 
    this.name = name; 
} 

public String getName(){ 
    return name; 
} 

非常簡單。現在我有另外一個抽象類來擴展它,並擴展了這個類,每個抽象類都帶有一些額外的變量/方法。 Item還有一個存根類,用於擴展它(只是調用super())的構造函數,如果Item可以具體化,可能不需要,但這取決於解決方案。

現在,讓我們假設這些具體類中的任何一個都可能包含MyObject的一個實例。大量的項目將被創建。 Item層次結構中的任何類的一些實例將擁有它,有些不會。程序在編譯時無法說明。我無法真正將分層結構拆分爲兩個單獨但幾乎相同的樹,一個是MyObject,另一個是沒有。這會導致很多代碼重複。使用包含MyObject的另一個具體類對具體實現進行子類化將意味着過度的類型檢查,這會變得很難看,特別是如果層次結構增長的話。將接口/抽象類放到更遠的位置並不是一種選擇,因爲它會將MyObject放在所有東西中。無論解決方案如何,所有這些都必須具有通用的接口/抽象類。

我可能會挑剔,應該只是在層次結構頂部實現MyObject,並且檢查它,或者使用一個簡單的布爾方法告訴我它是否存在,但它仍然感覺有點草率,我會如果可能的話尋找更好的解決方案。

+0

沒有乾淨的方式。通常這意味着你的類層次有點怪異,應該重構... – Thihara

+0

我試過了,但我找不到合理的方法來重構它以分離兩者。 MyObject的存在增加了一個額外的功能,但沒有改變每個項目中的任何其他字段/方法。除此之外的類將遍歷Items集合並確定哪些具有MyObject,它們將基於該附加功能將它們分開(至少就用戶看到的而言,並非字面上在代碼中)。把它想象成有和沒有A/C的各種汽車的列表,但是如果A/C存在,我們需要知道它是什麼類型,它是如何工作的等等。一個簡單的標誌不會。 – user1017413

+1

您是否考慮從層次結構中刪除可選部分並使用合成將它們放置在需要的位置? – Thihara

回答

0

你對問題的描述讓我想起了Decorator模式的動機 - 一種過度膨脹的類層次結構,帶有某種想要的「多重繼承」和「超級類的組合」。看看互聯網上的Decorator的描述,並且看看Reader/Writer標準Java類是如何實現的。