0

具体的には、オブジェクトのリストがあります。オブジェクトのそのクラスの各サブクラスは、特定の機能に関連付けられています。

これがこの問題に対する私の単純な解決策であり、それは醜いです:

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>)
}
4

1 に答える 1

2

正しいことは、基本型のリスト ( List<SuperClass>) を使用してポリモーフィズムを使用することです。さまざまなサブクラスを反復するループで、それらを異なる方法で処理しないでください。あなたがすべきことは、スーパークラスで定義された特定のメソッド (より良いのはインターフェース) を呼び出し、各サブクラスでメソッドを異なる方法で実装することです (実装)。拡張クラスを返すを参照してください

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();
}

その秘訣は、さまざまな実装に共通する側面を定義し、それらすべてを同じ署名にまとめることができるようにすることです。

于 2013-04-11T00:33:54.147 に答える