2014-07-22 143 views
0

我有一個抽象類C0。 我有幾個其他類從C0繼承。他們重寫抽象方法並擁有自己的特殊方法。使用抽象類ArrayList

我想創建一個包含每一個這些專門類的ArrayList。

這裏的代碼顯示如何我(想)做它一大塊:

ArrayList<C0> A = new ArrayList<>(); 
A.add(new C1()); 
A.add(new C2()); 

A.get(x).method_of_C0(); // Works because my classes extend C0. 
A.get(0).method_of_C1(); // Does not work 
A.get(1).method_of_C2(); // Does not work 

我希望能夠通過此ArrayList調用C1的C2和自己的方法。這可能嗎?我通過手動投射嘗試了一些調整,但我沒有成功。

+2

=>看看「多態性」 – Mik378

+0

困難的方法是看,如果有通過反射的方法 –

回答

4

您或者需要保留一個單獨的ArrayList的C1和C2實例,或者您必須將它們轉換爲它們各自的類型以使用子類型的方法。喜歡的東西:

A.get(x).method_of_C0(); 
((C1)A.get(0)).method_of_C1(); 
((C2)A.get(1)).method_of_C2(); 

您也可以使用的instanceof關鍵字來檢查一個元素實際上是一個特定亞型的實例,你做的鑄造前,否則你會得到一個ClassCastException。

但請注意,這有一個非常糟糕的代碼氣味,所以跟蹤每個子類型,因爲你需要他們可能是要走的路。

0

這裏的問題是您在實例化ArrayList的新實例時沒有聲明對象類型。
這裏是爲您解決問題最簡單的方法:

ArrayList<C0> A = new ArrayList<C0>(); 
A.add(new C1()); 
A.add(new C2()); 

現在下面的代碼行應該工作。只要C1和C2是C0的子類。

A.get(0).method_C1(); 
A.get(1).method_C2();