java - 以子类作为参数的重载方法,但将方法称为父类(super class)

标签 java overloading subclass extending-classes

我有一个抽象类 Animal ,有两个扩展类,DogCat .

public abstract class Animal {
...
}
public class Dog extends Animal {
...
}
public class Cat extends Animal {
...
}

在另一个类(class),我有一个 ArrayList<Animal> animals包含 Cat 的实例和 Dog .

ArrayList<Animal> 的类中, 我希望能够重载一个方法 doSomething()Dog dCat 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/

相关文章:

java - XMLUnit比较忽略元素的顺序

c++ - 为什么 'operator<<(cout, double)' 不起作用?

ios - 子类未找到父类(super class)接口(interface)的 Objective-c 错误

java - 子类中的变量可见性

c++ - 正确包含基类和子类(派生类)的头文件?

java - 如何在运行测试方法时让 Intellij 显示日志

java mysql准备语句

java - 从 JSONArray 中删除 JSON 对象 - Jettison

C++:使用委托(delegate)构造函数时选择 `const char *` 与 `std::string`

parameters - 具有可选参数的冲突重载方法