它通常认为,至少在贾瓦和C++,使用继承法进行再使用(见Joshua Blach s“Effective Java”的论点)。 通常最好使用composition(或某种形式的代表团)。
在您的案例中,我把事情完全放在一起,例如<代码>。 Piece 仅为enum
。 代表零件类型:
public final class Piece {
public static enum Type {
PAWN {
List<Move> getLegalMoves(Color c, Location l) { /* ... */ }
},
BISHOP { /* ... */ },
KNIGHT { /* ... */ },
ROOK { /* ... */ },
QUEEN { /* ... */ },
KING { /* ... */ }; // i hope i didn t forget anything :P
abstract List<Move> getLegalMoves(Color c, Location l);
// ... etc.
}
private final Type type;
private final Color color;
private Location location;
public Piece(Type type, Color color, Location location) {
this.type = type;
this.color = color;
this.location = location;
}
public List<Move> getLegalMoves() {
return type.getLegalMoves(color, location);
}
// ... etc.
}
因此,所有部分的共同逻辑一旦在<代码>Piece上实施,不同部分则按<代码>排列。 类型代码>。 如果你需要知道你重新研究的哪类东西,那么你就不需要使用<条码>的<>instanceof,并做任何事情,那么你只是执行<条码>。