我有这些接口(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
时,我必须将其转换为类型 ICitizen
或 IShipOwner
明确应该调用哪个方法。
从客户端的角度来看,调用这些方法的最佳方式是什么?如果可能的话,我确实想避免在保留方法重载的同时强制转换参数。
- 即使不是每个
IShipOwner
都是ICitizen
,也让公民实现IShipOwner
,反之亦然。 - 使用不同的方法名称。
- 我没有想到的其他事情。
最佳答案
测试对象的能力是一种代码味道。这意味着您没有使用语言中内置的 OO 功能。您可能应该完全摆脱 isHumanPlayer
方法。然后,无论您在哪里测试 isHumanPlayer
并根据结果做不同的事情,只需在 IPlayer
上调用一个方法,根据实现做不同的事情。
我的建议:
interface Player
- 此处显示常见行为,包括根据isHumanPlayer
的值执行的任何操作的方法。interface HumanPlayer extends Player
- 添加仅与人类玩家相关的方法。interface AiPlayer extends Player
- 添加仅与 AI 播放器相关的方法。
HumanPlayer
和 AiPlayer
添加的方法应该只被你的程序中与玩家打交道的部分调用,特别是 人类或 AI 玩家.您应该很少(如果有的话)发现有必要施法。如果这样做,您在转换对象上调用的方法可能需要向上移动层次结构。
根据您描述的现有层次结构,听起来人类和 AI 玩家都是 ShipOwner
。但是 ShipOwner
接口(interface)的确切位置取决于是否有任何其他类型的不是 ShipOwner
的 Player
,或任何类型的 ShipOwner
不是 Player
。
关于java - 方法重载 : best usage approach,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34188143/