所以我天真地写了一个抽象类(一个游戏板),其中包含一个没有访问修饰符的字段,用于存储游戏状态的数组(一个 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 方块的副本,它甚至没有被初始化。