多态性
这取决于您希望如何构建游戏逻辑,但在抽象Piece
类中定义常见行为(方法)和属性(字段)然后让每个子类型实现抽象方法(或覆盖默认方法)和根据继承字段的变化方式设置继承字段的值。也许是这样的:
public abstract class Piece {
protected int value;
public int getValue() {
return value;
}
public abstract boolean isValidMove(String move);
public void move(String move) {
//common logic here
doMove(move);
}
protected abstract void doMove(String move);
}
public class King extends Piece {
public King() {
this.value = 20;
}
public boolean isValidMove(String move) {
//specific king logic here
}
protected void doMove(String move) {
//more specific king logic
}
}
这将允许您使用多态性来定义具有公共Piece
API 的各个部分,而重要的差异由每个具体类型处理。
Piece king = new King();
//...
if(king.isValidMove(move)) king.move(move);
枚举
枚举允许您创建一组优化的通用类型的单例实例,这些实例也可以定义行为,但它们不能很好地支持覆盖/实现特定于类型的行为,因为您最终必须检查当前实例是哪个枚举实施变化。当您真的需要多个游戏(一个白王和一个黑王,8 个白棋和 8 个黑棋)时,您最终也会遇到只有一个KING
或一个实例的问题。PAWN
public enum Piece {
KING(20),
PAWN(1);
private int value;
private Piece(int value) {
this.value = value;
}
public int getValue() {
return value;
}
public boolean isValidMove(String move) {
switch(this) {
case KING:
//king specific logic
break;
case PAWN:
//pawn specific logic
break;
}
}
public void move(String move) {
if(this == KING) {
//king specific logic
} else if(this == PAWN) {
//pawn specific logic
}
}
}
因此,在这种情况下,枚举可能不会很好地工作。