Java:从父对象数组访问子类方法

时间:2015-10-05 17:02:38

标签: java arrays oop polymorphism

我正在尝试创建一个以Piece类开头的程序。为了练习的目的,每个其他班级都延伸Piece。其他类包含移动片段的方法,一个空格或n个空格。

所有碎片都存储在2D阵列中,用于移动。

我的问题是,如果我创建一个Pieces数组,我无法访问移动方法,因为它们存储在子类中。我也不能只是转换对象,因为我有4种不同的类型,用户可以要求移动。

这是向棋盘添加一块的代码

//adds a piece based on given type, but only if the space is clear (null)
public void addpiece(String type, String n, String c, int x, int y){
    if(board[x][y] == null){
        if(type == "FastFlexible"){
            board[x][y] = new FastFlexiblePiece(n,c,x,y);
        }
        else if(type == "FastPiece"){
            board[x][y] = new FastPiece(n,c,x,y);
        }
        else if(type == "SlowFlexible"){
            board[x][y] = new SlowFlexiblePiece(n,c,x,y);
        }
        else if(type == "SlowPiece"){
            board[x][y] = new SlowPiece(n,c,x,y);
        }
        else{
            System.out.println("Invaild type");
        }
    }
}

这是试图移动该片段的代码,我得到的错误是因为父Piece没有移动方法,但我无法找到一种方法来获取片段正确投射

 //Move a piece, two method one for fast and one for slow
public void movePiece(int x, int y, String direction){
    if(board[x][y] != null){
        if(board[x][y].getType().equals("SlowPiece")){
            board[x][y] = board[x][y].move(direction);
        }
        else if(board[x][y].getType().equals("SlowFlexible")){
            board[x][y] = board[x][y].move(direction);
        }
    }
}

快速碎片有另一种类似的方法。

slowPiece的构造函数:

//Constructor
public SlowPiece(String n, String c, int x, int y){
    super(n,c,x,y);
    this.setType("SlowPiece");
}

但是代码没有注意到任何片段的类型,所以我无法正确地转换它们

2 个答案:

答案 0 :(得分:1)

Polymorphism的目的是避免编写类似于为public void movePiece(int x, int y, String direction){指定的实现的代码。

board [x] [y]可以引用SuperType Piece及其任何子类型,如SlowPiece,SlowFlexible,FastPiece,FastFlexible。 Piece可以具有在类的定义中指定的抽象move行为,而无需提供实现。 Piece类的所有SubTypes都为move方法提供了自己的实现。

方法public void movePiece(int x, int y, String direction)简单归结为:

    public void movePiece(int x, int y, String direction){ 
        board[x][y].move(direction);
    }

在运行时,动态调度move方法,具体取决于Piece类的SubType。

答案 1 :(得分:0)

我的建议是在父Piece课程中添加abstract method

public class Piece{
    public abstract void move();
}

注意:现在您无法直接实例化Piece。此代码是非法的:

Piece p = new Piece();