避免使用instanceof但将函数参数限制为超类的一组子类

时间:2013-09-15 20:40:52

标签: java subclass superclass

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

示例:

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

上面的代码似乎有些不对,是否有更好,更有效或更通用的方式?

1 个答案:

答案 0 :(得分:1)

为避免对每个子类型执行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()方法不被修改。