0

私は大規模なコードベースの一部をリファクタリングしようとしていますが、コードが似ているところにいます -

abstract class Animal {
    String type;
}

class Dog extends Animal {
    public Dog() { type = "DOG"; }
}

 class Cat extends Animal {
    public Cat() { type = "CAT"; }
 }

現在、コードベース全体に List< Animal > を入力として受け取るメソッドがたくさんあるため、これらのインターフェイスを妨害したくありません。これらのメソッドの多くでは、通常、リストが繰り返され、リスト内のすべてのオブジェクトの Animal オブジェクトの「タイプ」属性に応じて、いくつかの処理が行われます。このために、Animal から Cat または Dog への醜いダウンキャストを行う必要があります。例:

class Processor {
    public void process(List<Animal> animals) {
        for(Animal animal: animals) {
            if(animal instanceof Dog) { // or if type.equals("DOG")
                Dog dog = (Dog) animal;
                dog.bark();
            } else if {....}
        }
    }

}

何か他に方法がないか考えてみました。何かご意見は?

4

1 に答える 1

0

クラスを改善して、このタイプのオブジェクトの期待される動作をより適切にキャプチャできる場合はAnimal、それを最初に行う必要があります。

それ以外は、与えられた情報から私が提案できることはあまりありません。

于 2013-06-06T00:29:03.490 に答える