【发布时间】:2013-04-06 09:47:42
【问题描述】:
嗨,我想知道是否有一个简单的解决方案可以解决我的问题,
我有一个ArrayList:
ArrayList <Animal> animalList = new ArrayList<Animal>();
/* I add some objects from subclasses of Animal */
animalList.add(new Reptile());
animalList.add(new Bird());
animalList.add(new Amphibian());
它们都实现了一个方法move() - 当move() 被调用时,Bird 会飞起来。
我知道我可以使用 this 访问超类的常用方法和属性
public void feed(Integer animalIndex) {
Animal aAnimal = (Animal) this.animalList.get(animalIndex);
aAnimal.eat();
}
没关系 - 但现在我想访问子类 Bird 拥有的 move() 方法。
我可以通过将Animal 转换为Bird 来做到这一点:
Bird aBird = (Bird) this.animalList.get(animalIndex);
aBird.move();
在我的情况下,我不想这样做,因为这意味着我对Animal 的每个子类型都有 3 组不同的上述代码。
好像有点多余,有没有更好的办法?
【问题讨论】:
-
为什么 Animal 没有你在子类中重写的
move()方法? -
... 呼叫移动?如果它没有调用子类实现,那么你没有告诉我们一些事情。
-
@user2278797 让您知道:我编辑了您的问题以获得更好的格式并更改了类的名称(因为它们在您的代码中不一致):我从他们的名称中删除了
s-es在它们被添加到animalList的行中。他们是:animalList.add(new Reptiles()); animalList.add(new Birds()); animalList.add(new Amphibians());现在是:animalList.add(new Reptile()); animalList.add(new Bird()); animalList.add(new Amphibian());。如果您在自己的任何代码中使用它们,请确保相应地更改它们或重新编辑您问题的代码。 -
我非常困惑为什么这被如此赞成,因为这个问题是无稽之谈,并且暗示了对多态性概念的误解。似乎 OP 认为在第一块代码中的
(Animal)强制转换将导致调用超类的move()实现。它不会,因为对象实际是的子类的覆盖move()将被调用。换句话说,(Animal)类是完全多余的,Java 语言已经提供了所要求的确切功能而无需更改任何内容。
标签: java methods arraylist subclass superclass