2012-11-04 65 views
1

我需要某種類型的數據結構,它可以包含同一個超類的異構子類,我已經實現了所有這些子類。Java - 包含同一超類的一組不同子類的數據結構

到目前爲止,我試圖有一個ArrayList<SuperClass> list = new ArrayList<SuperClass>(); 然後,我假設我將能夠將列表的每個插槽到任何一個子類,但這不是很好的工作。

我需要一個有效的方式來做到上述。

謝謝!

+0

嗯。什麼不工作? – Vlad

+0

@BheshGurung實際上應該是'Collection'而不是'List' – Woot4Moo

回答

4

你可以用任何存在的數據結構來做,我會推薦ListSet。例如:

Collection<Super> supers = new ArrayList<Super>(); 

現在,當你這樣說:

我假設我就能列表中的每個插槽扔在任 的子類,

也就是說一個無效的假設。該集合將包含任何擴展了Super的對象,但不能隨意將每個元素轉換爲任何所需的元素。您將需要每個元素做一個instanceof測試,如果你正在尋找類型的功能,例如如下:

for(Super currentSuper : supers) 
{ 
    if(currentSuper instanceof SubA) 
    { 
     SubA subA = (Suba) currentSuper); 
     // do stuff with subA 
    } 
    else if(currentSuper instanceof SubB) 
    { 
     SubB subB = (SubB) currentSuper); 
     // do stuff with subB 
    } 
} 

範圍爲需要的話。

現在對弗拉德點:

和更好的設計是不實際測試類是什麼, 只是調用一個虛擬的方法,它會做正確的事 任何case

如果您可以保證所有潛在子類的功能,並且不會覆蓋您的類(如果您沒有最終標記它們),則不需要執行測試實例。相反,您的代碼可能如此簡單:

for(Super currentSuper : supers) 
{ 
    currentSuper.doSomethingNifty(); 
} 
+3

...並且更好的設計不是測試實際的類是什麼,而只是調用一個虛擬方法,無論如何它都會做正確的事情。 – Vlad

+0

@Vlad你的意思是像'C#'中的那樣,你可以聲明一個函數'virtual',或者這有點不同嗎? – Woot4Moo

+0

是的。順便說一句,在Java中,這些方法默認是虛擬的,與C#相反。 – Vlad

相關問題