我正在为学校项目创建一个游戏,我有一个名为Pieces and Powers的2个类,子类为Piece_Yellow,Piece_Blue ...和Power_Explode,Power_ChangeColor等......
我正在使用enum和来自这个网站的人(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 - 来自具有相同颜色的片段的所有哈希码都是相同的...我真的不知道如何解决这个问题。我已经读过我可以覆盖哈希码方法,但没有信息可以区分它们(我无法存储位置,因为每次更改位置时我都必须更改它。)
答案 0 :(得分:2)
它似乎不是真正的hashCodes是你的问题。这是对象简单相等。依赖于具有不同hashCodes的两个不等对象的代码并不严格正确。 return 1;
是Object#hashCode()
完全合法的实现。
最简单的事情似乎是将一个clone()方法放在Piece上,所有子类都可以实现这个方法,以便在需要不同的,不同的对象的地方返回副本。
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();
}