换句话说,如何强制方法仅使用给定输入参数的子类(它是超类)?

例:

public class Animal {
    ...
}

public class Dog extends Animal {
...
}

public class Cat extends Animal {
...
}

public class Test {
   ...
   public void makeSound(Animal animal) throws Exception{
      if(animal instanceof Dog){
         System.out.println("bark");
      } else if (animal instanceof Cat) {
        System.out.println("meow");
      } else {
        throw new Exception ("Not valid subclass of Animal");
      }
   }
}


上面的代码似乎有些错误,是否有更好,更有效或通用的方法?

最佳答案

为了避免对每个子类型进行instanceof检查,可以在makeSound()类中创建抽象的Animal方法,并在所有子类中覆盖。我将创建Animalabstract,因为它实际上是您方案中的抽象实体:

abstract class Animal {
    abstract void makeSound();
}

class Dog extends Animal {
    void makeSound() { System.out.println("Bark"); }
}

class Cat extends Animal {
    void makeSound() { System.out.println("Meow"); }
}


然后在Test类中,只需在makeSound引用上调用Animal。它将根据实际实例调用适当的重写方法:

public void makeSound(Animal animal){
    animal.makeSound();
}


现在,每次添加新的Animal子类型时,只需覆盖该类中的makeSound()。使用抽象方法,您将被迫这样做。并保持Test#makeSound()方法不变。

07-27 21:06