私は大規模なコードベースの一部をリファクタリングしようとしていますが、コードが似ているところにいます -
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 {....}
}
}
}
何か他に方法がないか考えてみました。何かご意見は?