我正在用 Java 为一款两人纸牌游戏编写一个游戏引擎,我的学生将为该游戏编写 AI 玩家。
人工智能玩家将轮流在他们面前的“桌子”的“场地”上打牌。他们可以用自己场上的牌攻击对方场上的牌。卡片可以面朝上或面朝下。
GameEngine 类允许 AI 玩家通过调用 GamePlayer.TakeTurn(GameEngine eng) 方法轮流进行。玩家可以向游戏引擎询问防守玩家的场地,以便玩家可以根据那里的牌数以及哪些牌正面朝上做出决定。假设这个方法是 GameEngine.GetDefendingField()
现在,我要确保攻击玩家不能修改防守玩家的区域或防守玩家区域中的牌,并且攻击玩家只能识别防守玩家区域中面朝上的牌。
我有 Card、Field(卡片数组列表)、GamePlayer 和 GameEngine 类。有没有办法为 Field 创建一个接口,以便 GameEngine 可以返回防守玩家的 Field,而攻击玩家无法更改它?并且进攻方无法将防守方的场地重新塑造成可以改变的东西。
我可以让 GameEngine.GetDefendingField() 返回无法重新转换为 Field 的 Field 的只读接口吗?
tia,
Sh-
如果您想在不复制的情况下实现此目的,并且无法将只读接口引用强制转换为相应的读写接口,则可以尝试使用包装器方法。
对于这样的界面:
interface Info {
String getInfoA();
void setInfoA(String infoA);
String getInfoB();
void setInfoB(String infoB);
}
您可以创建一个只读包装器,它会忽略设置器或引发异常,例如:
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 或抛出非法访问异常之间进行选择。
注意:当然,对于使用反射来检索包装对象的代码,您将无法安全。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)