Java重写继承的方法

时间:2013-11-14 10:02:13

标签: java inheritance

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

3 个答案:

答案 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[]

另外,您应该在Boardpublic staticMutableBoard。如果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,以便子类可以继承它。