换句话说,如何强制方法只使用给定输入参数的子类,这是超类?
示例:
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");
}
}
}
上面的代码似乎有些不对,是否有更好,更有效或更通用的方式?
答案 0 :(得分:1)
为避免对每个子类型执行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()
方法不被修改。