0

所以我天真地写了一个抽象类(一个游戏板),其中包含一个没有访问修饰符的字段,用于存储游戏状态的数组(一个 Square[])。此类具有使用此 Square[] 实现的各种方法。我还有两个子类都从这个类继承,使用它们父类的相同方法。

现在,出于某种原因,我必须将我的 Square[] 设为私有。我认为一个简单的解决方法是像往常一样制作一个 getter 方法,

Class Board {
...
    /**An array contain all the Squares for my board. */
    private Square[] squares;

    public Square[] getSquares() {
        return squares;
    }
}

class MutableBoard extends Board {

    /** An N x N board in initial configuration. */
    MutableBoard(int N) {
        _N = N;
        squares = new Square[_N * _N];
        for (int i = 0; i < squares.length; i++) {
            squares[i] = new Square();
        }
    }

    @Override
    void copy(Board board) {
        _N = board.size();
        _moves = board.numMoves();
        squares = new Square[board.getSquares().length]; //Errors here when used
        for (int i = 0; i < squares.length; i++) {
            squares[i] = board.squares[i].clone();
        }
    }
}

class ConstantBoard extends Board {

    /** A new ConstantBoard that allows a read-only view of BOARD. */
    ConstantBoard(Board board) {
        _board = board;
        squares = board.getSquares();
    }
}

但是每次尝试使用继承的方法访问或修改子类中的数组时,我都会不断收到空指针异常。我认为因为我的 Square[] 是在我的父类中定义的,它试图访问 Board 的数组副本,而不是子类的副本。有谁知道一个简单的解决方法,它不涉及将我所有的方法都放在两个子类中(并破坏整个继承点)?

例如,在我的复制方法中,我希望能够同时传入 MutableBoard 和常量板,但我认为它试图以某种方式访问​​ Board 方块的副本,它甚至没有被初始化。

4

3 回答 3

2

你应该回来Square[]

public Square[] getSquares() {
    return squares;
}

squares[]是 type Square,因此该方法应该返回 aSquare[]而不是 aBoard

您还需要确保已squares[]初始化

private Square[] squares = new Square[someSize];

for (int i = 0; i < suqares.length; i++){
    squares[i] = new Square();
}

_N此外,在您尝试初始化它之前,您还没有删除它MutableBoard

 _N = N;

public class MutableBoard extends Board {
    int _N;

    public MutablerBoard(int N){
        _N = N;
    }
}

-or- 

public abstract class Board {
    int _N;
}

same for _board

另外,你应该square[]在你的Board课堂上做public static。您无法从MutableBoardif its修改它,private并且您无法访问squarefrom的“当前状态” ConstantBoardif it is not static

于 2013-11-14T10:04:56.087 回答
0

getSquares() 不应该返回正方形吗?

public Square[] getSquares() {
        return squares;
 }

您声明要返回 Board 类的实例并返回 Squares 数组。

于 2013-11-14T10:06:19.040 回答
0

假设你的意思是:

public Square[] getSquares() {
 return squares;
}

您尚未初始化数组squares。你需要:

Square[] squares = new Square[SIZE];

即便如此,尽管数组将被初始化,但数组Square中的每个仍将为空。您还需要对它们进行初始化:

for (int i=0; i<SIZE; i++) {
  squares[i] = new Square();  //or some other way of getting a `Square`
}

上面,SIZE 是一些static final int表示方格的数量。

编辑:

MutableBoard看不到squares数组,Board因为它的私有和子类不继承私有字段或方法。您拥有的代码不应编译。构造函数中的squares变量不是.MutableBoardsquaresBoard

我建议您更改squaresprotected子类可以继承它。

于 2013-11-14T10:10:00.110 回答