2013-04-11 77 views
0

具體來說,我有一個對象列表。該類對象的每個子類都與一個特定的功能相關聯。Java - 如何從超類的列表中乾淨地構造子類的列表?

這是我天真地解決了這個問題,這是醜陋:

List<SuperClass> superClasses = ... 

List<Subclass1> obj1 = Lists.newArrayList(); 
List<Subclass1> obj2 = Lists.newArrayList(); 
List<Subclass1> obj3 = Lists.newArrayList(); 
List<Subclass1> obj4 = Lists.newArrayList(); 
... 

for (SuperClass obj : superClasses) { 
    if (obj.getClass().equals(Subclass1.class)) { 
    obj1.add((Subclass1) obj); 
    } 
} 

//repeat for each subclass 

我也嘗試過這樣的事情:

public Map<Class, List<SuperClass>> constructMap(List<SuperClass> superClasses); 

但是這不能用於:

(List<Subclass1>) constructMap(superClasses).get(Subclass1.class) 
cannot cast from List<SuperClass> to List<Subclass1>. 

我註定了這裏的樸素代碼嗎?是否真的沒有聰明的方法來獲取超類對象列表並根據它們的實際類來處理它們?


這裏是我試圖解決的問題:

public Driver { 

    List<Fruit> fruits = collectAllFruit(); 

    StemHandler.pullStem(fruitsThatAreApples, fruitsThatArePears); 
    ColorHandler.getColor(fruitsThatAreApples, fruitsThatAreOranges, fruitsThatArePears); 


public interface Fruit { 

    getColor(); 
} 

public class Apple implements Fruit { 

    getColor(); 
    pullStem(); 
} 

public class Orange implements Fruit { 

    getColor(); 
    peel(); 

} 

public class Pear implements Fruit { 

    getColor(); 
    pullStem(); 

} 


public interface FruitHandler { 


} 

public class StemHandler extends FruitHandler { 

    pullStem(List<Apple>, List<Pear>) 

} 

public class ColorHandler extends FruitHandler { 

    getColor(List<Apple>, List<Orange>, List<Pear>) 
} 

回答

2

正確的做法是使用基本類型(List<SuperClass>)的列表中使用多態。你不應該在迭代遍歷不同的子類的循環中處理它們。你應該做的是調用在超類(更好,一個接口)上定義的特定方法,並在每個子類(實現)中以不同的方式實現該方法。見Returning an extended class

interface MyInteface{ 
    public void doSomething(); 
} 

class Sub1 implements MyInterface{ 
    public void doSomething() { 
     System.out.println("Behavior # 1"); 
    } 
} 

class Sub2 implements MyInterface{ 
    public void doSomething() { 
     System.out.println("Different Behavior"); 
    } 
} 

for (MyInteface obj : superClasses) { 
    // Will do different things for different implementations 
    obj.doSomething(); 
} 

祕訣是定義什麼是不同的實現的通用特性,能夠將它們全部擠入相同的簽名。

+0

「能夠將它們全部擠入相同的簽名」正是這裏不適合我的東西。每個類代表一個命令,所以我所調用的是基於它的類。 – Jeremy 2013-04-11 00:56:42

+0

@Jeremy應該有可能。發佈一個簡單的示例,說明您實際正在嘗試做什麼,並且有人可能會建議如何讓代碼具有多態性。打開對象的類型**真的**在OO圈子裏皺起了眉頭 – 2013-04-11 01:00:03

+0

編輯添加一個例子。希望很明顯。這個問題正在爲處理者找到合適的成果。 – Jeremy 2013-04-11 01:10:50