它通常被認爲是不好的做法,至少在Java和C++,使用繼承了代碼重用的目的(見約書亞布洛赫的「有效的Java」的論點)。代之以使用構圖(或某種其他形式的委託)通常更好。
在你的情況下,我把周圍的事物完全,使得Piece
是final class
採取簡單的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
中實施一次,不同部分由Type
封裝。如果你需要知道你正在看什麼樣的作品,那麼你不需要使用instanceof
或者其他任何東西,你只需要實現Piece.getType()
和switch
就可以了。
也許抽象而不是界面? – iCantSeeSharp