java - 方法重载 : best usage approach

标签 java overloading

我有这些接口(interface):

public interface IShipOwner {}

public interface ICitizen {}

public interface IPlayer extends ICitizen, IShipOwner {}

public interface IAIPlayer exends IPlayer {}

此外,我在同一个类中有这两种方法:

public boolean isHumanPlayer(ICitizen citizen) {
    if (citizen instanceof IPlayer) {
        if (citizen instanceof IAIPlayer) {
            return false;
        } else {
            return true;
        }
    }
    return false;
}

public boolean isHumanPlayer(IShipOwner shipOwner) {
    if (shipOwner instanceof IPlayer) {
        if (shipOwner instanceof IAIPlayer) {
            return false;
        } else {
            return true;
        }
    }
    return false;
}

当使用 IPlayer 类型的对象调用 isHumanPlayer 时,我必须将其转换为类型 ICitizenIShipOwner 明确应该调用哪个方法。

从客户端的角度来看,调用这些方法的最佳方式是什么?如果可能的话,我确实想避免在保留方法重载的同时强制转换参数。

  1. 即使不是每个 IShipOwner 都是 ICitizen,也让公民实现 IShipOwner,反之亦然。
  2. 使用不同的方法名称。
  3. 我没有想到的其他事情。

最佳答案

测试对象的能力是一种代码味道。这意味着您没有使用语言中内置的 OO 功能。您可能应该完全摆脱 isHumanPlayer 方法。然后,无论您在哪里测试 isHumanPlayer 并根据结果做不同的事情,只需在 IPlayer 上调用一个方法,根据实现做不同的事情。

我的建议:

  • interface Player - 此处显示常见行为,包括根据 isHumanPlayer 的值执行的任何操作的方法。
  • interface HumanPlayer extends Player - 添加仅与人类玩家相关的方法。
  • interface AiPlayer extends Player - 添加仅与 AI 播放器相关的方法。

HumanPlayerAiPlayer 添加的方法应该只被你的程序中与玩家打交道的部分调用,特别是 人类或 AI 玩家.您应该很少(如果有的话)发现有必要施法。如果这样做,您在转换对象上调用的方法可能需要向上移动层次结构。

根据您描述的现有层次结构,听起来人类和 AI 玩家都是 ShipOwner。但是 ShipOwner 接口(interface)的确切位置取决于是否有任何其他类型的不是 ShipOwnerPlayer,或任何类型的 ShipOwner 不是 Player

关于java - 方法重载 : best usage approach,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34188143/

相关文章:

c++ - 成员函数重载/模板特化问题

scala - 如何从 Scala 中的派生类辅助构造函数调用辅助基类构造函数?

java - 为什么我应该在写入数据之前检查 channel isWritable()

java - NetBeans 中的无效部署描述符错误

Java - 通过反射查看时,通用变量变为 java.lang.Object

java - 上限泛型的问题

java - 此 Activity 出现错误 : You need to use a Theme. AppCompat 主题(或后代)

java - MVEL 运算符重载

c++ - 重载预自增运算符

C++ 重载运算符 [ ][ ]