所以我天真地写了一个抽象类(游戏板),其中包含一个没有访问修饰符的字段,用于存储游戏状态的数组(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和Constant Board,但我认为它试图以某种方式访问Board的正方形副本,甚至没有初始化。
答案 0 :(得分:2)
您应该返回Square[]
public Square[] getSquares() {
return squares;
}
squares[]
属于Square
类型,因此该方法应返回Square[]
而不是Board
您还需要确保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
中MutableBoard
。如果private
square
,您无法修改ConstantBoard
,并且您无法访问当前状态&#34;来自static
的{{1}},如果它不是{{1}}。
答案 1 :(得分:0)
没有getSquares()应该返回正方形吗?
public Square[] getSquares() {
return squares;
}
您声明要返回Board类的实例并返回Square数组。
答案 2 :(得分:0)
假设你的意思是:
public Square[] getSquares() {
return squares;
}
您尚未初始化数组squares
。
你需要:
Square[] squares = new Square[SIZE];
即便如此,虽然数组将被初始化,但数组中的每个Square
仍将为null。你也需要对它们进行初始化:
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
构造函数中的MutableBoard
变量不 squares
中的Board
字段。
我建议您将squares
更改为protected
,以便子类可以继承它。