我正在重构我拥有的一个巨大的 if 语句。我发现改进它的方法之一是使用多态性和继承。以一种非常简化的方式,这就是我的代码中的内容:
public abstract class Animal {
public abstract void doAction();
}
public class Dog extends Animal {
public void doAction() {System.out.println("run");}
}
public class Cat extends Animal {
public void doAction() {System.out.println("sleep");}
}
public class RunActions {
public void runAction(Dog d) {
d.doAction();
}
public void runAction(Cat c) {
c.doAction();
}
}
public class Start {
public static void main(String args[]) {
Animal animal = new Dog();
new RunActions().runAction(animal); // Problem!
}
}
我知道我知道。我可以打电话给animal.doAction();。或者在 RunActions 中添加一个接收 Animal 作为参数的方法。
但是为什么编译器不允许我调用最后的“runAction(animal)”行呢?JVM 不应该在运行时找出动物是 Dog 的一个实例吗?
是否有特定原因不允许我这样做?
编辑:忘记让 Dog 和 Cat 扩展 Animal。固定的。