换句话说,如何强制方法仅使用给定输入参数的子类(它是超类)?
例:
public class Animal {
...
}
public class Dog extends Animal {
...
}
public class Cat extends Animal {
...
}
public class Test {
...
public void makeSound(Animal animal) throws Exception{
if(animal instanceof Dog){
System.out.println("bark");
} else if (animal instanceof Cat) {
System.out.println("meow");
} else {
throw new Exception ("Not valid subclass of Animal");
}
}
}
上面的代码似乎有些错误,是否有更好,更有效或通用的方法?
最佳答案
为了避免对每个子类型进行instanceof
检查,可以在makeSound()
类中创建抽象的Animal
方法,并在所有子类中覆盖。我将创建Animal
类abstract
,因为它实际上是您方案中的抽象实体:
abstract class Animal {
abstract void makeSound();
}
class Dog extends Animal {
void makeSound() { System.out.println("Bark"); }
}
class Cat extends Animal {
void makeSound() { System.out.println("Meow"); }
}
然后在
Test
类中,只需在makeSound
引用上调用Animal
。它将根据实际实例调用适当的重写方法:public void makeSound(Animal animal){
animal.makeSound();
}
现在,每次添加新的
Animal
子类型时,只需覆盖该类中的makeSound()
。使用抽象方法,您将被迫这样做。并保持Test#makeSound()
方法不变。