我正在用Java编写一个游戏引擎,用于双人纸牌游戏,我的学生将为其编写AI玩家.
AI玩家将把扑克牌轮流放到他们面前"桌子"的"场地"上.他们可以用自己场上的牌攻击另一个玩家场上的牌.卡片可以面朝上或面朝下.
GameEngine类通过调用GamePlayer.TakeTurn(GameEngine eng)方法允许AI玩家轮到他/她.玩家可以向游戏引擎询问防守玩家的场地,以便玩家可以根据那里的牌数以及哪些牌面朝上来做出决定.假设这个方法是GameEngine.GetDefendingField()
现在,我想确保攻击玩家无法修改防御玩家的场地或防守玩家场地中的牌,并且攻击玩家只能识别防守玩家场中的面朝上牌.
我有Card,Field(一个ArrayList of Cards),GamePlayer和GameEngine的课程.有没有办法为Field创建一个接口,以便GameEngine可以返回防守玩家的场地而攻击玩家无法改变它?并且没有攻击玩家能够将防守球员的场地改造成可以改变的东西.
我可以让GameEngine.GetDefendingField()返回一个无法重新转换为字段的字段的只读接口吗?
TIA,
SH-
rsp*_*rsp 11
如果要在不复制的情况下实现此目的,并且无法将只读接口引用强制转换为相应的读写接口,则可以尝试使用包装器方法.
对于这样的界面:
interface Info {
String getInfoA();
void setInfoA(String infoA);
String getInfoB();
void setInfoB(String infoB);
}
Run Code Online (Sandbox Code Playgroud)
您可以创建一个只读包装器,它忽略setter或throws异常,例如:
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(); }
}
Run Code Online (Sandbox Code Playgroud)
通过使用包装器方法,您可以在客户端使用多态,安全地反对转换引用以获得更多访问权限,并在静默忽略调用setter或抛出非法访问异常之间进行选择.
注意:当然,对于使用反射来检索包装对象的代码,您将无法安全.