3

我正在为一个学校项目创建一个游戏,我有 2 个名为 Pieces 和 Powers 的类,有子类 Piece_Yellow、Piece_Blue ... 和 Power_Explode、Power_ChangeColor 等...

我是用枚举做的,这个网站上的某个人(更准确地说是 mikera)帮助我改变了这一点,并与碎片和权力建立了更好的互动。

但是现在我必须更改旧代码,并且我遇到了问题,因为我是这样做的:

int x = 10, y = 5;
for (int i=0; i<10; i++) {
    if (pecas[x][y] == null)
        pecas[x][y] = new Piece(arrayPecas.get(rand.nextInt(arrayPecas.size())));
}

像这样,我的数组部分填充了 10 个不同颜色的新对象(但没有权力,这就是问题所在),并且每个对象都有不同的哈希码(用于稍后查找、比较和删除这些对象)......

但是由于我们不能初始化一个抽象类,我发现这个问题的唯一解决方案是这样做:

int x = 10, y = 5;
for (int i=0; i<10; i++) {
    if (pecas[x][y] == null)
        pecas[x][y] = arrayPecas.get(rand.nextInt(arrayPecas.size()));
}

像这样仍然添加了对象,但现在我有 1 个问题: 1 - 来自具有相同颜色的部分的所有哈希码都是相同的......我真的不知道如何解决这个问题。我读过我可以覆盖 hashcode 方法,但没有信息可以区分它们(而且我无法存储位置,因为每次更改位置时我都必须更改它)。

4

1 回答 1

2

你的问题似乎并不是真正的 hashCodes 。这是对象只是平等的。依赖于具有不同 hashCode 的两个不相等对象的代码并不严格正确。 return 1;是一个完全合法的实现Object#hashCode()

最简单的事情似乎是在所有子类都可以实现的 Piece 上放置一个 clone() 方法,以便在您想要不同的、不同的对象的地方返回副本。

public abstract class Piece {

  public abstract Piece clonePiece();

}

public class YellowPiece extends Piece {

  @Override
  public Piece clonePiece() {
    return new YellowPiece(this.relevantThing1, this.relevantThing2 // etc etc)
  }
}

int x = 10, y = 5;
for (int i=0; i<10; i++) {
    if (pecas[x][y] == null)
        pecas[x][y] = arrayPecas.get(rand.nextInt(arrayPecas.size())).clonePiece();
}
于 2012-05-29T02:53:51.930 回答