我正在尝试重构一个大型代码库的部分,并且我在代码类似的地方-
abstract class Animal {
String type;
}
class Dog extends Animal {
public Dog() { type = "DOG"; }
}
class Cat extends Animal {
public Cat() { type = "CAT"; }
}
现在代码库中有很多方法都接受List<动物>作为输入,所以我不想打扰那些界面。在许多这些方法中,通常对列表进行迭代,并且根据列表中每个对象的Animal对象的"type"属性完成一些处理。为此,我必须从动物到猫或狗做丑陋的向下投射。例子:动物>
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 {....}
}
}
}
我想知道是否有其他的方法来做这件事。任何想法吗?
如果您可以改进您的Animal
类以更好地捕获这类对象的预期行为,那么这应该是要做的第一件事。
除此之外,根据所给的信息,我没有什么建议。