2

我在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 ?谢谢。

4

3 回答 3

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
}
于 2013-06-15T17:36:31.900 回答
2

您将在 中声明Animal.drown()并覆盖它Fish,其中包含适当的“终止代码”:)。因此,您只需要调用drown()每个动物,每个实例都会根据其类型特定的方法实现来运行。

public class Human {
     public void drown(Animal animal) {
         animal.drown();
     }
}
于 2013-06-15T17:38:26.140 回答
0

方法可以根据它们的参数重载。你可以有两种不同的方法:

public void drown(Fish f) {
  return;
}

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

但是,应该注意的是,这使得确定某些动物是否会淹没Human班级的责任,正如其他答案所示,这是有争议的。

于 2013-06-15T17:43:37.340 回答