Это одна из тех ситуаций, когда выполнение OOP, насколько это возможно, приведет вас в тупик.
Может быть проще думать об этом так: у шахматной фигуры есть цвет, а не владелец.
Вы можете описать цвет, используя enum
:
enum ChessColor {
BLACK,
WHITE
}
Я бы посоветовал не создавать сложную иерархию классов для типов фигур:
enum ChessPieceType {
PAWN,
KNIGHT,
BISHOP,
ROOK,
KING,
QUEEN
}
С их помощью определить простой тип шахматной фигуры легко (хотя Java немного многословно!) ...
public final class ChessPiece {
public final ChessColor Color;
public final ChessPieceType PieceType;
public ChessPiece(final ChessColor color, final ChessPieceType pieceType) {
this.color = color;
this.pieceType = pieceType;
}
public boolean equals(final ChessPiece obj) {
return this.pieceType == obj.pieceType &&
this.color == obj.color;
}
@Override
public boolean equals(final Object obj) {
if (obj == this) {
return true;
}
if (obj instanceof ChessPiece) {
return equals((ChessPiece)obj);
}
return false;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + color.hashCode();
result = prime * result + pieceType.hashCode();
return result;
}
}
Но предположим, что вы хотите знать имя игрока, которому принадлежит фигура ? Я бы сказал, что это не свойство игры в шахматы, а свойство ситуации , в которой в нее играют.
public final class ChessMatch {
public final Player playerWhite;
public final Player playerBlack;
public final Map<BoardPosition, Piece> board;
// ...
}
Итак, чтобы ответить на ваш sepecifi c вопросов ...
Доступ к владельцу напрямую из части
Это не делает Смысл делать, так как владелец фигуры это не свойство шахмат, а только цвет. Вместо этого получите доступ к этому через ChessMatch
(или любой другой объект).
Доступ ко всем принадлежащим фигурам напрямую от игрока
Это может быть реализовано как функция из BoardState
к списку произведений. Например:
public List<ChessPiece> fetchPiecesForColor(final Map<BoardPosition, ChessPiece> board, final ChessColor color) {
final List<ChessPiece> results = new ArrayList<>();
for (final Map.Entry<String, String> entry : board.entrySet()) {
// ...
}
return results;
}