我真的应该像瘟疫一样避免这种情况吗?

时间:2014-03-23 11:07:59

标签: java instanceof

我正在开发一种棋盘游戏,其中包括将棋子放入牢房。只要没有任何对手的作品,你就可以将棋子放在棋盘上的任何地方(包括被占用的牢房)。

现在我已经考虑过两种方法:

  • 没有instanceof:

RedPiece.class片段

public boolean isAlly(RedPiece p) {
    return true;
}

public boolean isAlly(BluePiece p) {
    return false;
}

public boolean isAlly(GreenPiece p) {
    return false;
}

显然,如果我想添加新颜色,我必须为每个类添加另一种方法。

  • 使用instanceof

Piece.class片段

public boolean isAlly(Piece that) { 
    return this instanceof that;
}

这种后来的方法对我来说似乎更好,因为在添加新颜色时我不需要做任何事情。

当然,对于我的游戏来说,这不是一个问题,因为所有部分都是相同的,我可以只创建一个枚举而不是新的类。 但是如果红队突然被赋予了蓝色和绿色没有的特殊能力呢?

也许解决方案是添加一个带有字符串的属性,说明他们属于哪个团队(红色玩家和蓝色玩家),但现在它的设计使红色部分只属于红队。字符串" RED"绝对是你可以从课堂上获得的冗余信息。

总结:在这里使用instanceof是否合理?谁能想到更好的方法?

3 个答案:

答案 0 :(得分:5)

没有instanceof的代码没有多大意义:您将无法将Piece作为参数传递给任何方法。

使用instanceof的代码无法编译,因为instanceof需要一个类名,而不是一个对象。 我不确定你的作品是否有子类是个好主意。如果你只需要他们拥有另一个状态,而不是另一个状态,那么你应该在Piece中有一个color字段。无论如何,你可以通过以下方式简单地实现你想要的东西:

public abstract class Piece {
    public abstract String getColor();

    public final boolean isAlly(Piece otherPiece) {
        return this.getColor().equals(otherPiece.getColor());
    }
}

public class RedPiece extends Piece {
    @Override
    public String getColor() {
        return "red";
    }
}

如果您没有任何getColor()方法,则可以使用this.getClass().equals(otherPiece.getClass()),但这会阻止您拥有BigRedPiece子类,例如。

答案 1 :(得分:1)

我认为您应该为您的超级flag添加allyPiece变量,因为每个部分都是盟友。

答案 2 :(得分:1)

另一种方法可以在每个片段中实施

Public String getColor(){
    return this.color;
}

并进行比较......

isAlly(Piece p){
    return this.color.equals(p.getColor());
}

当然可以使用int而不是string来优化比较