2013-02-15 59 views
3

我刚刚开始学习java,所以我在理解我认为是多态性问题时遇到了一些麻烦。我试图编写一个国际象棋游戏,所以我有一个名为GamePiece的超类数组,其子类PawnPiece扩展了。我在这两个类中都有一个名为MovePiece()的方法,它可以改变棋子的位置。当我使用MovePiece()时,更改了PawnPiece的位置值,但是当我尝试在我的主代码中调用位置时,它会给我'GamePiece'的位置不变。下面是我的一些代码:从超类数组访问子类字段?

public class GamePiece { 
    int position; 

    //Constructor 
    public GamePiece(int x){ 
     position=x; 
    } 
    public void MovePiece(int positionOfMove){}; 
} 

public class PawnPiece extends GamePiece{ 
    int positionPawn; 

    //Subclass Constructor 
    public PawnPiece(int x){ 
     super(x); 
    } 

    public void MovePiece(int positionOfMovePawn){ 
     positionPawn=x; 
} 

public classChessMain{ 
    public static void main(String[] arg){ 
     GamePiece[] allPieces = new GamePiece[32]; 
     int startPositionPawn = 9;  //Arbitrary# 
     allPieces[8]=new PawnPiece(int startPositionPawn); //index is arbitrary 
     int playerMove = 5;  //Arbitrary# 
     allPieces[8].MovePiece(playerMove); 
    } 
} 

最后一行给我的初始位置(9在这种情况下),但我知道,如果我能访问PawnPiece的位置,它会给我5.任何帮助你在那里编码向导?我真的很感激它。

+0

'positionPawnX = X;' - > x是不可访问在此范围 – exexzian 2013-02-15 02:29:46

+0

@sansix糟糕。应该是'positionPawn'。谢谢。 – Scrantonicity83 2013-02-15 02:47:47

回答

2

几个问题:

  1. GamePiece和方法MovePiece应该是抽象的。通过这种方式,您将强制任何选择为GamePiece的子类实现其自己的MovePiece方法。
  2. 你存储的位置在两个地方:

    • int positionGamePiece
    • 你有PawnPieceint positionPawn

    你可能想只有其中之一:PawnPiece摆脱positionPawn,并在GamePiece使用position

  3. (可选)Java约定是有方法名称以小写字母:重命名MovePiecemovePiece
+0

非常好!我明白我现在在做什么。我想我的问题比我想象的要简单得多。万分感谢! – Scrantonicity83 2013-02-15 03:02:36

1

从给定的我可以猜测,在PawnPiece正在更新变量positionPawn代码,然后检查变量位置。所以你写错了地方。

+0

谢谢!我删除了'int positionPawn',现在只使用GamePiece中的'int position'。 – Scrantonicity83 2013-02-15 03:04:30