Я пытаюсь создать простую шахматную программу, и при реализации продвижения пешки возникла небольшая проблема. У меня есть класс абстрактного класса и 6 классов (король, королева, ладья, рыцарь, епископ и пешка), расширяющие его. Поэтому, когда пешка доходит до другого конца доски, я хочу, чтобы он изменился, чтобы сказать королеву.Повторное использование этого «обхода»
Самый простой бы сделать что-то вроде этого:
Public class Pawn extends Piece {
...
@Override
public void move(int toCol, int toRow) {
this.col = toCol; this.row = toRow;
if (toRow == endRow)
this = (Queen)this
}
}
что, очевидно, невозможно, так как можно просто не назначить это.
Так что мне нужно обнаружить продвижение и бросить его извне. Но по некоторым причинам я дважды хранил конфигурацию. Как 2D-массив пьес, но и как 2 списка частей каждого игрока. Это означает, что мне нужно найти пешку в списке и удалить ее, а затем добавить новую королеву с одинаковыми координатами, а затем назначить ее на доску [col] [row].
Я хотел бы знать, есть ли более хороший способ сделать это. Как-то изменить класс объекта из «внутри».
Изменение типа объекта объекта для экземпляра объекта - это не то, что позволяет Java. Вместо этого вы можете убрать экземпляр пешки и заменить его новым экземпляром Queen. Или ... у вас может быть перечисление, представляющее тип и переменную-член, чтобы удерживать его в классе Piece и переключать тип таким образом ... –
Вы понимаете, что означает литье? Ссылки на объекты кастинга никоим образом не преобразуют объекты из одного типа в другой, поэтому вы не можете использовать это для преобразования объекта 'Pawn' в объект' Queen'. Единственное, что делает casting, это сказать компилятору, что вы хотите временно отключить проверку типов. Проверка будет выполняться во время выполнения, а когда это произойдет, вы получите «ClassCastException». – Jesper
В принципе, вы можете заменить свой мини-легковой автомобиль внедорожником, но вы не можете изменить мини-внедорожник. – RealSkeptic