【发布时间】:2018-08-23 16:04:09
【问题描述】:
我有一个抽象类Animal,有两个扩展类Dog 和Cat。
public abstract class Animal {
...
}
public class Dog extends Animal {
...
}
public class Cat extends Animal {
...
}
在另一个类中,我有一个 ArrayList<Animal> animals,其中包含 Cat 和 Dog 的实例。
在带有ArrayList<Animal> 的类中,我希望能够以Dog d 或Cat c 作为参数重载方法doSomething(),但仍然能够从动物的ArrayList 中调用它们。如下:
public void aMethod(){
ArrayList<Animals> animals = getTheAnimals();
for (Animal a : animals){
doSomething(a);
}
}
public void doSomething(Dog a){
//a is an object of type dog
}
public void doSomething(Cat a){
//a is an object of type cat
}
本质上,每个方法都充当一个“选择器”,该方法正在接收type of animal 的“选择器”。
如上尝试,我得到以下编译错误:
错误:找不到适合 doSomething(Animal) 的方法
我知道我可以使用instanceOf 或a.getClass().equals(type) 之类的东西,但我读到这是不好的做法。
这个问题与this other question 略有不同,因为我想要两个单独的方法,每个方法都有不同的参数。
编辑:我将避免使用访问者模式,因为我认为它不太适合我的实际实现。将 doSomething() 方法移动到每个类中,并进行重构以确保这具有逻辑意义(每个类都执行它应该负责的操作)。谢谢。
【问题讨论】:
-
只在抽象类中有
doSomething方法,所以Dog和Cat必须实现它。然后,在循环时,只需调用doSomething,它就会调用特定于实现的对象。 -
如果有人写
Bird extends Animal并将Bird bird = new Bird()放入列表中。应该调用哪个方法? -
doSomething()应该在Anmial中,并在每个子类中被覆盖。所以不是doSomething(a),而是a.doSomething()。 -
这是不可能的,因为要调用的方法是在编译时选择的。
标签: java overloading subclass extending-classes