一般的には、(引数についてジョシュア・ブロックの「効果的なJavaの」を参照してください)コードの再利用のために継承を使用するには、少なくともJavaとC++で、悪い習慣と考えられています。代わりにの構成(または他の形式の委任)を使用する方が良いでしょう。あなたのケースでは
私は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
で1回実装され、異なる部分はType
によってカプセル化されます。あなたが見ている作品の種類を知る必要がある場合は、instanceof
とキャストなどを使う必要はなく、Piece.getType()
とswitch
を実装するだけです。
おそらくインターフェイスではなく抄録を作成しますか? – iCantSeeSharp