【发布时间】:2019-07-21 23:03:58
【问题描述】:
现在我有了一个 Animal 类,并有三个子类对其进行了扩展:Dog、Cat 和 Fish。
class Dog extends Animal {
public void bark(){}
}
class Cat extends Animal {
public void catchMouse(){}
}
class Fish extends Animal {
public void swim(){}
}
我有一个清单:
List<Animal> listOfAnimals = new ArrayList<>();
然后我使用静态方法将 Dog、Cat 和 Fish 的对象添加到列表中:
public static void addAnimal(List<Animal> list, AnimalInfo info) {
Animal animal = new Animal();
switch (info) {
case 0:
animal = new Dog();
break;
case 1:
animal = new Cat();
break;
case 2:
animal = new Fish();
break;
}
list.add(animal);
}
我调用了这个静态方法 3 次,并依次将一个 Dog 对象、一个 Cat 对象和一个 Fish 对象添加到列表中。现在列表应该包含一个 Dog 实例、一个 Cat 实例和一个 Fish 实例。
现在我想在 Dog 实例上调用 bark():
list.get(0).bark();
但这显然行不通。
实现这一目标的最佳方法是什么?使用:
(Dog)(list.get(0)).bark();
?
【问题讨论】:
-
是的,就是这样做的。如果您不知道它是否是
Dog,您可以与animal instanceof Dog联系。 -
您似乎错误地处理了这个...您有一个
Animal列表,并且您假设位置 0 是 Dog ?教科书示例有Animal.makeNoise()。Dog将覆盖makeNoise()并使其“吠叫”。Cat将覆盖并使其“喵”等。重点是,您不必对列表中的哪个动物做出假设。 -
在我的设计中 makeNoise() 并不优雅,我想在获取时检查列表中对象的类型。那么看起来使用
instanceof()是最常用的方式吗? -
@Cyan 你可能问错了问题。标准的 OO 技术不优雅,你想做什么?
-
那或者你可以在
Animal类bool canMakeNoise()中添加一个抽象方法在尝试makeNoise()之前调用
标签: java