Как сделать метод из абстрактного суперкласса для работы с подклассами - PullRequest
0 голосов
/ 03 ноября 2019

Я играю в шахматы и попробовал использовать дизайн наследования для всех фигур. Я хочу, чтобы пешка подкласса использовала метод printPiece из Piece, но мне нужно изменить параметры каждого куска. Я знаю, что глупо иметь одинаковые параметры в обоих классах, но я не знаю, как заставить суперкласс использовать метод print без объявления значка в нем. То же самое, если я хочу создать геттеры для суперкласса, подклассы не распознают их.

Я попробовал предоставленный код, и он не распознает, что значок «i» из пешки, он просто используетметод суперкласса и пишет ноль. Также попытался сделать параметры защищенными, но результат тот же.

public abstract class Piece{
    private String name;
    private int value;
    private boolean alive;
    private char icon;

    public Piece() {}

    public abstract Coordinate movePiece(Coordinate coor);

    public abstract boolean canMovePiece();

    public void printPiece()
    {
        System.out.print(icon);
    }
}

public class Pawn extends Piece {
    private String name;
    private int value;
    private boolean white;
    private char icon;

    public Pawn(boolean pWhite) {
        super();
        this.value = 1;
        this.name = "Pawn";
        this.white = pWhite;
        if(pWhite) {this.icon = 'I';}
        else {this.icon = 'i';}
    }

    public Coordinate movePiece(Coordinate coor){}

    public boolean canMovePiece() {}
}

Ответы [ 2 ]

1 голос
/ 03 ноября 2019

Когда вы расширяете Piece, вы хотите наследовать вещи в Piece, которые являются общими для всех подклассов Piece. Поэтому вы не можете повторно объявлять переменные в Pawn.

            public class Piece
            {
                private char icon;
                public char getIcon() { return icon; }
                public void setIcon(char i) { icon = i; }
                public Piece(char c) { setIcon(c); }
            }

            public class Pawn extends Piece
            {
                public Pawn()
                {
                    super('I');
                }
            }

Это способ, позволяющий каждому подклассу иметь значок, хранящийся в Piece, и способы его установки и доступа к нему.

0 голосов
/ 03 ноября 2019

Объявляя private char icon в суперклассе, вы запрещаете подклассу доступ к нему.

Вместо повторного объявления private char icon в подклассе, который скрывает родительскую переменную, вы можетеобъявите сеттер или сделайте его частью конструктора родителя.

...