gpt4 book ai didi

java - 如何为一个 Java 类创建两个接口(interface),一个是只读的,一个是可读写的?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:45:15 26 4
gpt4 key购买 nike

我正在用 Java 为两人纸牌游戏编写游戏引擎,我的学生将为此编写 AI 玩家。

AI 玩家将轮流在他们面前的“ table ”的“ field ”上打牌。他们可以用自己场上的一张卡攻击另一位玩家场上的卡。卡片可能面朝上或面朝下。

GameEngine 类允许 AI 玩家通过调用 GamePlayer.TakeTurn(GameEngine eng) 方法轮到他/她。玩家可以向游戏引擎询问防守玩家的区域,这样玩家就可以根据那里的牌数和哪些牌面朝上来做出决定。假设这个方法是 GameEngine.GetDefendingField()

现在,我要确保攻击玩家不能修改防御玩家的领域或防御玩家领域中的牌,并且攻击玩家只能识别防御玩家领域中正面朝上的牌。

我有 Card、Field(卡片的 ArrayList)、GamePlayer 和 GameEngine 类。有什么方法可以为 Field 创建一个界面,以便 GameEngine 可以在攻击玩家无法更改的情况下返回防守玩家的 field ?并且进攻球员无法将防守球员的 field 改造成可以改变的东西。

我能否让 GameEngine.GetDefendingField() 返回一个无法重铸为 Field 的 Field 的只读接口(interface)?

蒂亚,

嘘-

最佳答案

如果你想在不复制的情况下实现这一点,并且不可能将只读接口(interface)引用转换为相应的读写接口(interface),你可以尝试使用包装器方法。

对于这样的界面:

interface Info {
String getInfoA();
void setInfoA(String infoA);
String getInfoB();
void setInfoB(String infoB);
}

您可以创建一个忽略 setter 或抛出异常的只读包装器,例如:

class ReadonlyInfo implements Info {
final Info instance;
ReadonlyInfo(Info info) {
if (null == info) { throw new InvalidArgumentException(); }
instance = info;
}
String getInfoA() { return instance.getInfoA(); }
void setInfoA(String infoA) { /** silent ignore */ }
String getInfoB() { return instance.getInfoB(); }
void setInfoB(String infoA) { throw new IllegalStateException(); }
}

通过使用包装器方法,您可以在客户端使用多态性,安全地避免强制转换引用以获得更多访问权限,并在静默忽略调用的 setter 或抛出非法访问异常之间做出选择。

注意:当然,使用反射来检索包装对象的代码并不安全。

关于java - 如何为一个 Java 类创建两个接口(interface),一个是只读的,一个是可读写的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2364898/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com