我正在尝试重构大型代码库的一部分,并且处于代码类似的位置-
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 {....}
}
}
}
我想知道是否还有其他方法可以做到这一点。有什么想法吗?