我有一个抽象类 Animal
,有两个扩展类,Dog
和 Cat
.
public abstract class Animal {
...
}
public class Dog extends Animal {
...
}
public class Cat extends Animal {
...
}
在另一个类(class),我有一个 ArrayList<Animal> animals
包含 Cat
的实例和 Dog
.
在 ArrayList<Animal>
的类中, 我希望能够重载一个方法 doSomething()
与 Dog d
或 Cat c
作为参数,但仍然可以从 Animals 的 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
该方法正在接收动物。
按上述方法尝试时,出现以下编译错误:
error: no suitable method found for doSomething(Animal)
我知道我可以使用类似 instanceOf
的东西或 a.getClass().equals(type)
,但我读到这是不好的做法。
这个问题与 this other question 略有不同。 ,因为我想要两个单独的方法,每个方法都有不同的参数。
编辑: 我将避免使用访问者模式,因为我认为它不太适合我的实际实现。将 doSomething() 方法移动到每个类中,并重构以确保这在逻辑上有意义(每个类执行它应该负责的操作)。谢谢。
最佳答案
将方法移动到Abstract
类中,因此每个实现都必须制作自己的方法版本。
public abstract class Animal {
public abstract void doSomething();
}
public class Dog extends Animal {
public void doSomething(){
System.out.println("Bark");
}
}
public class Cat extends Animal {
public void doSomething(){
System.out.println("Meow");
}
}
然后在您上面提到的其他类中,您可以执行以下操作:
public void vocalize(){
ArrayList<Animals> animals = getTheAnimals();
for (Animal a : animals){
a.doSomething();
}
}
关于java - 以子类作为参数的重载方法,但将方法称为父类(super class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51989994/