2013-11-14 2 views
0

Итак, я наивно написал абстрактный класс (игровая доска), содержащий поле без модификатора доступа для массива, используемого для хранения состояния игры (квадрат []). Этот класс имеет различные методы, реализованные с использованием этого Square []. У меня также есть два подкласса, наследуемых от этого класса, используя эти же методы из своего родительского класса.Java переписывание унаследованных методов

Теперь, по той или иной причине, я должен сделать свой квадрат [] закрытым. Я думал, что простое исправление было бы сделать геттер, как обычно,

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(); 
    } 
} 

, но я получаю NULL указателя Исключения каждый раз, когда я пытаюсь получить доступ или изменить мой массив в моих подклассах, используя наследуемые методы. Я думаю, потому что мой квадрат [] определен в моем родительском классе, он пытается получить доступ к копиям массива, а не к подклассам. Кто-нибудь знает, как легко исправить это, что не включает в себя просто поместить все мои методы в оба подкласса (и победить всю точку наследования)?

Например, в моем методе копирования я хочу иметь возможность передавать как MutableBoard, так и Constant Board, но я думаю, что он пытается каким-то образом получить доступ к копии квадратов Board, которые даже не инициализированы.

+0

Код, который вы указали, даже не компилируется, поэтому вы не получите исключение NullPointerException ... Если вы не разместили свой * действительный * код, мы не сможем вам помочь. –

+0

Возвращаемый тип должен быть массивом квадратного «public Board [] getSquares()» – Prabhakaran

+0

Если вы получаете ошибку с нулевым указателем, вы можете инициализировать объект при создании, иначе он просто вернет квадраты, содержащие нуль. – david99world

ответ

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, если это не static.

+0

Извините, это была моя ошибка, набрав вопрос. Ред. – BrandonM

+0

Я думаю, что это должно быть опечатка, иначе он не будет компилироваться. – Prabhakaran

+0

@BrandonM, см. Остальную часть моего обновленного кода. –

0

Не getSquares() должен возвращать квадраты?

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

Вы заявляете, что хотите вернуть экземпляр класса Board, и вы возвращаете массив квадратов.

+0

да просто опечатка. Ред. – BrandonM

+0

Не могли бы вы показать код, в котором вы на самом деле создаете этот массив квадратов? Теперь, когда вы создаете класс Board, ваш массив равен null, потому что вы его не создали. – alicjab

0

Предполагая, что вы имеете в виду:

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

Вы не инициализируется массив squares. Вам понадобятся:

Square[] squares = new Square[SIZE]; 

Даже тогда, хотя массив будет инициализирован, каждый Square в массив все равно будет нулевым. Вам нужно initialsie их тоже:

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

Выше SIZE некоторые static final int с указанием количества квадратов.

EDIT:

Ваш MutableBoard не может увидеть squares массив в Board потому, что его личные и подклассы не наследуют частные поля или методы. Код, который у вас есть, не должен компилироваться. Переменная squares в конструкторе MutableBoard составляет неsquares Поле в Board.

Предлагаю вам изменить squares как protected, чтобы подклассы могли наследовать его.

+0

Не думайте, что это проблема. Извините за отсутствие информации. Отредактировал сообщение, чтобы сделать его более понятным. – BrandonM

+0

Ответ отредактирован, чтобы отразить новое заболевание ... – NickJ

Смежные вопросы