避免在observer方法中使用instanceOf

时间:2013-06-15 17:32:06

标签: java oop instanceof

我在Java中有以下系统:

public class Human {
     public void drown(Animal animal) {
          if (animal instanceOf Fish) {
              return;
          } else {
              animal.die();
          }
     }
}

public abstract class LandAnimal extends Animal{...}
public class Tiger extends LandAnimal{...}

public abstract class Fish extends Animal {...}
public class Trout extends Fish {...}

我想过添加方法

public abstract boolean drownable() {...}
在Animal类中,但我无法访问Animal类的代码。 据我所知,使用instanceOf被认为是糟糕的OOP实践。在这种情况下如何避免使用instanceOf?感谢。

3 个答案:

答案 0 :(得分:2)

drown()中的Human方法应该是(顺便说一句,为什么人类想要淹死动物?):

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

每个Animal都会知道该怎么做,例如:

// in class Tiger
public void drown() {
    die();
}

// in class Fish
public void drown() {
    // do nothing, fish can't drown
}

答案 1 :(得分:2)

您将声明Animal.drown()并在Fish中覆盖它,其中包含相应的'kill code':)。 所以你只需要在每只动物身上调用drown(),每个实例都会根据其特定类型的方法实现。

public class Human {
     public void drown(Animal animal) {
         animal.drown();
     }
}

答案 2 :(得分:0)

可以根据参数重载方法。您可以使用两种不同的方法:

public void drown(Fish f) {
  return;
}

public void drown(LandAnimal a) {
  a.drown();
}

然而,应该指出的是,这可以确定某些动物是否会淹没Human课程的责任,正如其他答案所示,这可以说是有争议的。