0

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

例子:

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");
      }
   }
}

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

4

1 回答 1

1

为了避免instanceof对每个子类型进行检查,您可以在类中创建一个抽象makeSound()方法Animal,并在所有子类中覆盖。我会创建Animalclass abstract,因为它在您的场景中确实是一个抽象实体:

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课堂上,只需makeSoundAnimal引用时调用。它将根据实际实例调用适当的重写方法:

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

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

于 2013-09-15T20:44:31.450 回答