Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使抽象超类的方法适用于子类_Java_Class_Abstract Class_Abstract_Superclass - Fatal编程技术网

Java 如何使抽象超类的方法适用于子类

Java 如何使抽象超类的方法适用于子类,java,class,abstract-class,abstract,superclass,Java,Class,Abstract Class,Abstract,Superclass,我正在下一盘棋,并尝试对所有棋子使用继承设计。 我想让子类pawn使用方法printPiece from Piece,但我必须修改每个Piece上的参数。 我知道在两个类上使用相同的参数有点傻,但我不知道如何让超类使用print方法而不在其中声明icon。 如果我想在超类上创建getter,子类也不会识别它们 我已经尝试了提供的代码,但它没有从典当中识别出图标是“I”,它只是使用超类方法并写入null。 还尝试使参数受到保护,但结果相同 public abstract class Piece{

我正在下一盘棋,并尝试对所有棋子使用继承设计。 我想让子类pawn使用方法printPiece from Piece,但我必须修改每个Piece上的参数。 我知道在两个类上使用相同的参数有点傻,但我不知道如何让超类使用print方法而不在其中声明icon。 如果我想在超类上创建getter,子类也不会识别它们

我已经尝试了提供的代码,但它没有从典当中识别出图标是“I”,它只是使用超类方法并写入null。 还尝试使参数受到保护,但结果相同

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

通过在超类中声明一个
私有字符图标
,可以阻止子类访问它


您可以声明一个setter,或使其成为父类构造函数的一部分,而不是在子类中重新声明一个隐藏父类变量的
私有字符图标。

扩展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');
                }
            }

这是一种让每个子类都有一个图标的方法,以片段的形式存储,以及设置和访问它的方法。

当前代码有什么问题?每个棋子都应该有自己的“图标”字符,否?可能是@HoverCraftFullOfels的副本是的,但当我打印棋盘上有棋子的正方形时(矩阵[1][0]=新棋子(true),矩阵由棋子对象组成,然后我选择要转换为棋子的对象)和矩阵[1][0]。printPiece()它不打印任何东西,但我希望能够创建一个典当而不传递参数,如果我把它放在父级的构造函数中,我将不得不传递否?另外,我假设setter在子类中,但是如何在不执行setter的情况下初始化pawn对象呢?像矩阵[1][0]=new Pawn(true)不会做setter,是吗?setter当然在父类中,因为字段是私有的谢谢!那确实有效。最后一个问题,我用一个布尔值来决定一个棋子是白的还是黑的,我在创建一个棋子时传递它,如果我只能有一个super('i')语句,而没有一个if(white)then super('i')else super('i'),我怎么能把它添加到棋子的构造函数中呢,我将if语句放在超级构造函数中,并使用Character.toLowerCase(c)。谢谢你的帮助,伙计!