如何为一个读取的Java类创建两个接口

我正在用Java编写一个游戏引擎,用于我的学生将要编写AI玩家的双人牌游戏。

人工智能玩家将轮流在他们的“场地”上打牌,作为他们面前的“桌子”的一部分。 他们可以在其他球员的场上用卡从他们的场上攻击。 卡可能面朝上或面朝下。

GameEngine类允许AI玩家通过调用GamePlayer.TakeTurn(GameEngine eng)方法轮到他/她。 玩家可以向游戏引擎询问卫冕玩家的场地,以便玩家可以根据卡牌数量以及哪些卡牌正面朝上做出决定。 假设这个方法是GameEngine.GetDefendingField()

现在,我想确保进攻球员不能修改防守球员的场地或防守球员场上的牌,并且进攻队员只能识别防守球员场中的面朝上牌。

我有Card,Field(卡片ArrayList),GamePlayer和GameEngine。 有没有办法为Field创建一个界面,以便GameEngine可以返回防御玩家的领域,而攻击玩家无法改变它? 并且没有进攻球员能够将防守球员的领域改变成可以改变的东西。

我可以让GameEngine.GetDefendingField()返回一个只读界面给不能重写到字段的字段吗?

TIA,

SH-


如果您希望在不复制的情况下实现此操作,并且无法将只读接口引用强制转换为相应的读写接口,则可尝试使用包装器方法。

对于这样的界面:

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(); }
}

通过使用包装器方法,您可以在客户端使用多态性,对于转换引用以获得更多访问权限以及在默默忽略被调用的setters或选择非法访问异常之间进行选择是安全的。

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


你在这里说的是基本的模型 - 视图 - 控制器,你的模型是卡和场,控制器是GamePlayer和GameEngine,视图尚未定义。 你的领域是你的模型,你会想创建两个不同的接口来访问Field模型,一个只读,一个读写。 您的读写实现可能会返回Field对象。 你的只读实现将撕裂字段中的元素,并仅返回他们有权访问的元素,对返回的字段中的每张卡片进行深层复制。


我喜欢在编译时使用类型安全和多态来控制这种访问控制的想法,特别是在教学时。

接近它的一个好方法是拥有两个Field接口。 也许Field和MutableField,后者扩展前者并添加更改方法。 你的FieldImpl当然可以实现这两个。

当然,问题在于你想根据你使用的字段从你的游戏引擎返回不同的声明类型(Field或MutableField)。 如果你有一个模型,你可以使用getMyField()和getOtherPlayerField()之类的东西,因为从描述中可以看出,当调用getField()时,人们确切知道他们想要的是哪个字段。

链接地址: http://www.djcxy.com/p/50207.html

上一篇: How to create two interfaces to a Java class one read

下一篇: How can one set javadoc options in a wrapper of the standard doclet?