簡體   English   中英

試圖在Java中訪問子類變量

[英]Trying to access a subclass variable in Java

public void movePiceTo(int x, int y, Piece pieceToMove) {

    if(pieceToMove.canMove(board, pieceToMove.getX(), pieceToMove.getY(), x, y)){ //Check if the piece canMove to the location

        if(board[x][y] == null) { //Check if the location is empty

            removePiece(pieceToMove.getX(), pieceToMove.getY());
            board[x][y] = pieceToMove;

            if(pieceToMove instanceof Pawn) {
                pieceToMove = (Pawn)pieceToMove;
                pieceToMove.isFirstMove = false;
            }

此代碼段控制棋子的移動。 在底部3行,它試圖將Pawn類的isFirstMove變量更改為false,因為它不再是Pawn的第一次移動。 但我很難改變變量,因為pieceToMove對象基本上是Piece類(Pawn的超類),而不是Pawn類。 我怎樣才能順利完成這項工作?

你將pieceToMovePawn ,但變量的類型仍然是Piece

嘗試這個:

if(pieceToMove instanceof Pawn) {
    Pawn pawnToMove = (Pawn) pieceToMove;
    pawnToMove .isFirstMove = false;
}

您可以修復強制轉換,但是您應該完全刪除代碼,因為它遵循非常危險的模式。 當你這樣做

if(item instanceof SomeType) {
    SomeType castItem = (SomeType)item;
    castItem.doSomethingSpecial();
}

您正在設置代碼,以便在添加新類型和更改SomeType 這是一個非常糟糕的主意。

更好的方法是添加一個方法,通知任何一塊它不再是第一步,並調用它,無論它是否是Pawn

class Piece {
    public void setMoved() {
        // do nothing
    }
    ...
}
class Pawn extends Piece {
    private boolean isFirstMove = true;
    public void setMoved() {
        isFirstMove = false;
    }
    ...
}
...

removePiece(pieceToMove.getX(), pieceToMove.getY());
board[x][y] = pieceToMove;
pieceToMove.setMoved(); // <<== The instanceof check is gone

您應該將實例PawnPawn

Pawn pawn = (Pawn)pieceToMove;
pawn.isFirstMove = false;

首先看看這個 ,清楚地了解你在Java中的演員。

你會明白,如果你想訪問變量,你將不得不創建一個新的對象實例

Pawn pawnToMove = (Pawn) pieceToMove;

然后,您可以通過執行此操作來訪問變量

pawnToMove .isFirstMove = false;

現在進一步深入,我認為你必須為你的對象創建一個setter,不要直接訪問變量

pawnToMove.setFirstMove(false);

請注意,您可以在一個九中執行此操作,而無需創建Pawn的新實例

((Pawn) pieceToMove).setFirstMove(false);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM