public class Animal {
int a;
int b;
int c;
}
public class Dog extends Animal {
int d;
int e;
}
public class Cat extends Animal {
int f;
int g;
}
ArrayList listAnimal = new ArrayList();
if (condition) {
Dog dog = new Dog();
dog.setA(..);
dog.setB(..);
dog.setC(..);
dog.setD(..);
dog.setE(..);
listAnimal.add(dog);
} else {
Cat cat = new Cat();
cat.setA(..);
cat.setB(..);
cat.setC(..);
cat.setF(..);
cat.setG(..);
listAnimal.add(cat);
}
看到上面的代码就会想到是否能重构一下减少代码量。if else中的代码有一部分是重复的。一般我们都会想到像这样重构一下:
Animal animal = new Animal();
animal.setA(..);
animal.setB(..);
animal.setC(..);
if (condition) {
Dog anim = (Dog) animal;
anim.setD(..);
anim.setE(..);
} else {
Cat anim = (Cat) animal;
anim.setF(..);
anim.setG(..);
}
listAnimal.add(anim);
实际上面的代码是有问题的,它不符合多态的特性。不能把一个父类Animal类对象转成子类Dog类或Cat类对象。使用多态来重构这段代码应该是这样的:
Animal animal;
if (condition) {
Dog dog = new Dog();
dog.setD(..);
dog.setE(..);
animal = dog;
} else {
Cat cat = new Cat();
cat.setF(..);
cat.setG(..);
animal = cat;
}
animal.setA(..);
animal.setB(..);
animal.setC(..);
listAnimal.add(animal);
上面代码声明一个父类Animal变量,在创建子类对象,处理完它们各自才有的属性,然后将子类对象赋给父类变量,这是符合多态特性的。最后在add到listAnimal中。