2011-12-21 32 views
1

我可能有錯誤的想法與這一點,但我承擔......如何輸入一個類作爲其子類中的一個動態

我有一個我想與多個子的一個調用一個函數類類型ComboA,ComboB等(都擴展了超類「Combos」)。

ArrayList<Combos> combos = null; //of type combos, which is super class of Combo A and Combo B 
    switch (which) { 
     case 1: 
      combos = CombosA; //this is of type ComboA 
      break; 
     case 2: 
      combos = CombosB; //this is of type ComboB 
      break; 
} 

根據switch語句,我希望函數(組合)中的單個變量保留子類的所有類函數。這樣我就不必爲每個組合類型創建一堆函數了 - 我想使用相同的變量名稱(組合),而不管它是哪個子類。

我嘗試使用仿製藥,但事情是,在CombosA和CombosB變量此範圍內,全球該類的定義之外,我不知道如何使用仿製藥,除非我定義功能

public <E extends Combos> void Test(ArrayList <E> CombosA) 

或者類似的東西,我想這將需要另一個單獨的變量在函數調用中發送,而不是全局的。我可能能夠複製CombosA數組列表並將副本發送到函數中以使通用函數可以工作,但是,我認爲必須有更好的方法。

任何幫助將不勝感激!

+0

這與泛型沒有任何關係。 – 2011-12-22 12:43:31

回答

0

這取決於你下一步想要做什麼與選定的「combo」。由於ComboAComboBCombos的子類,因此理想情況下,您只需調用「Combos」方法即可對每個組合執行常見操作。然後每個子類都可以執行它自己的函數實現。

例如,如果你打算做一些更新對ComboAComboB等,則有可能在Combos類的update()方法(可能是抽象的)。 ComboA的版本爲update()ComboB的版本爲update()。然後你的循環只是循環調用update()方法的組合,知道每個組合都會做正確的事情,而不必指定類型。

這有幫助嗎?

+0

但ComboA和ComboB都有不同的變量,這些變量是運行其餘函數所必需的。就像ComboA可能有一個ComboB沒有的變量A - 而ComboB有B但ComboA沒有,但是用一些重複的代碼編寫兩個完全不同的函數,我想用一些開關創建一個函數語句,只需將諸如將ComboA.getA()更改爲ComboB.getB()等重要行。我的設計是錯的,還是有意義? – Anthony 2011-12-21 18:43:37

+0

你好安東尼。你想要做的是正確的(ComboA和ComboB可以並且應該有不同的變量,方法等),但是當你想以普通的方式處理它們時(就像你的循環所做的那樣),那個循環需要調用一個常用的方法(並不在乎它是A還是B等)。這種常見的方法可以使用公共父類中的通用代碼,只是將特定的不同直接傳遞給父方法作爲參數。或者,您可以將此通用代碼放置在ComboA和ComboB都使用的一些緊密相關的助手類中。 – 2011-12-22 06:00:21

+0

已經有一段時間了,但我回來看看這個答案,意識到你是對的。我需要添加一個通用方法來處理對象本身的差異,而不是試圖將邏輯放在不屬於它的地方。 – Anthony 2012-04-09 20:36:32

相關問題