Bootstrap
本文主要介绍一个简单例子,通过多态来重构减少代码量。
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中。