首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >避免在观察者方法中使用instanceOf

避免在观察者方法中使用instanceOf
EN

Stack Overflow用户
提问于 2013-06-16 01:32:06
回答 3查看 234关注 0票数 2
代码语言:javascript
运行
复制
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 {...}

我想过要添加一个方法

代码语言:javascript
运行
复制
public abstract boolean drownable() {...}

在Animal类中,但我不能访问Animal类的代码。据我所知,使用instanceOf被认为是糟糕的OOP实践。在这种情况下,如何避免使用instanceOf?谢谢。

EN

回答 3

Stack Overflow用户

发布于 2013-06-16 01:36:32

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

代码语言:javascript
运行
复制
 public void drown(Animal animal) {
      animal.drown();
 }

并且每个Animal将知道要做什么,例如:

代码语言:javascript
运行
复制
// in class Tiger
public void drown() {
    die();
}

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

Stack Overflow用户

发布于 2013-06-16 01:38:26

您可以声明Animal.drown()并在Fish中覆盖它,其中包含适当的“kill code”:)。因此,您只需在每个动物上调用drown(),每个实例将根据其特定类型的方法实现来执行操作。

代码语言:javascript
运行
复制
public class Human {
     public void drown(Animal animal) {
         animal.drown();
     }
}
票数 2
EN

Stack Overflow用户

发布于 2013-06-16 01:43:37

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

代码语言:javascript
运行
复制
public void drown(Fish f) {
  return;
}

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17126168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档