【问题标题】:Alternative to using instanceof in this case?在这种情况下使用 instanceof 的替代方法?
【发布时间】:2017-11-23 11:05:51
【问题描述】:

所以在这个给定的场景中,我不完全确定如何以更 OOP 的方式实现它。

鉴于以下上下文:

  • 我的游戏有一个超类实体
  • 生物(移动实体)和静态实体(树木/岩石/等)扩展实体
  • 我有一个 EntityManager 类。

在我的 EntityManager 中,我检查我的鼠标是否悬停在一个实体上。如果是这种情况,我会渲染一个叠加层,显示一个带有实体名称的面板。

除了名称之外,我还想显示一些基本统计数据,例如“健康”以及“力量/最大命中”或其他内容。静态实体没有战斗属性。然而,生物可以,但由于我返回一个实体,我检查该实体是否是“instanceof”生物,如果是:绘制战斗统计数据。否则只画实体的名字。

有没有更好、更面向对象的方式来设计这个结构?我已经读到 instanceof 可以通过多态/OO 设计来避免。

相关代码sn-p:

    if(hoveringEntity instanceof Creature) {
        hoveringEntity = (Creature) hoveringEntity;

        // Custom Util class to draw a String
        Text.drawString(g, "Max hit: " + getDamage(hoveringEntity), x, y, true, Color.YELLOW, Assets.font14);
    }

【问题讨论】:

  • 欢迎来到 Stack Overflow!请拿起tour,环顾四周,并通读help center,尤其是How do I ask a good question?What topics can I ask about here?。仅查看 3 行代码是无法说明这一点的。这是一个影响很多课程的设计问题。
  • 应该/可能有一个 getDisplayInfo() 方法返回应该显示的内容。然后,您可以覆盖它以提供尽可能多或尽可能少的信息。您现在正在以一种命令式的方式写作,“如果 x 是实体,请执行此操作,如果 x 是生物,请执行此操作”,而应该更多的是“让 x 做它需要做的事情”。

标签: java oop polymorphism instanceof


【解决方案1】:

EntityManager这样的类系统,调用抽象方法getInfo()(在具体类StaticEntityCreature中实现),可以检索到所需的信息。
也许这不是最好的解决方案,因为它在EntityManagerEntity 之间引入了硬耦合,但它不需要使用instanceOf

【讨论】:

    猜你喜欢
    • 2023-03-04
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多