gpt4 book ai didi

java - 在这种情况下如何避免 instanceof 运算符

转载 作者:搜寻专家 更新时间:2023-11-01 01:10:46 28 4
gpt4 key购买 nike

我正在编写一个简单的游戏,其中包含玩家可以处于FreeTaken 两种状态的单元格。

interface Cell {
int posX();
int posY();
}

abstract class BaseCell implements Cell {

private int x;
private int y;

public int posX() {
return x;
}

public int posY() {
return y;
}

...
}

class FreeCell extends BaseCell {
}

class TakenCell extends BaseCell {
private Player owningPlayer

public Player owner() {
return owningPlayer;
}

}

在每个回合中,我需要检查所有单元格以使用以下方法计算下一个单元格状态

// method in class Cell
public Cell nextState(...) {...}

并收集(在 Set 中)所有尚未使用的单元格。上面的方法返回 Cell 因为 cell 可能会从 Free 变为 Taken 或相反。我正在做类似下面的事情来收集它们:

for (Cell cell : cells) {
Cell next = cell.futureState(...);
if(next instanceof FreeCell) {
freeCells.add(currentCell);
}
...
}

太丑了。如何做到这一点以避免这种 instanceof 黑客攻击?我不是在谈论另一个 hack,而是想找到合适的 OOP 解决方案。

最佳答案

听起来你在和 "State" pattern 调情但你还不在那里。使用状态模式,您将拥有 Cell 对象和“Cell State”类的层次结构。

Cell 对象将使用组合而不是继承。换句话说,Cell 将具有当前状态属性。如果您有一个 Cell,其中 currentState 属性是一个 FreeState 对象,那么它就是一个空闲单元格。如果 Cell 的 currentState 属性是 TakenState 对象,那么它就是自由状态。

How to do that to avoid such instanceof hacks?

每当您遇到需要执行 instanceof 的情况时,您可以向 Cell 类添加一个方法并调用它。 Cell 代表当前状态。 Cell 中委托(delegate)当前状态的代码实际上并不知道状态是什么。它只是相信国家会做正确的事。在您的 FreeState 和 TakenState 中,您提供每个方法的实现,这些方法根据它们的状态做正确的事情。

关于java - 在这种情况下如何避免 instanceof 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13424974/

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