【问题标题】:How to make a method from abstract super class to work for subclasses如何使抽象超类的方法适用于子类
【发布时间】:2020-02-28 18:11:27
【问题描述】:

我正在制作一个国际象棋游戏并尝试对所有棋子使用继承设计。 我想让子类 pawn 使用 Piece 中的 printPiece 方法,但我必须修改每件的参数。 我知道在两个类上使用相同的参数有点傻,但我不知道如何让超类使用 print 方法而不在其中声明图标。 如果我想在超类上创建吸气剂,子类无法识别它们。

我已经尝试了提供的代码,但它无法识别出图标是来自 pawn 的“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() {}
}

【问题讨论】:

  • 您当前的代码有什么问题?每件作品都应该有自己的“图标”字符,不是吗?
  • @HovercraftFullOfEels 是的,但是当我打印一个有棋子的棋盘正方形时(matrix[1][0] = new Pawn(true) ,矩阵由 Piece 对象组成,然后我选择将哪些转换为碎片)和 matrix[1][0].printPiece() 它不打印任何东西

标签: java class abstract-class abstract superclass


【解决方案1】:

通过在超类中声明private char icon,可以防止子类访问它。

除了在子类中重新声明 private char icon 之外,这会隐藏父变量,您可以声明一个 setter,或使其成为父构造函数的一部分。

【讨论】:

  • 但是我希望能够在不传递参数的情况下创建一个 pawn,如果我将它放在父级的构造函数中,我将不得不传递 no?另外,我假设 setter 在子类中,但是如何在不必执行 setter 的情况下初始化 pawn 对象?像 matrix[1][0] = new Pawn(true) 不会做二传手吧?
  • setter 当然是在父类中,因为该字段是私有的
【解决方案2】:

当你扩展 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 中的方法,以及设置和访问它的方法。

【讨论】:

  • 非常感谢!那确实奏效了。最后一个问题,我使用一个布尔值来决定一个棋子是白色还是黑色,我在创建一个棋子时传递它,如果我只能有 1 个 super('I'),我如何将它添加到 pawn 的构造函数中语句而不是 if(white) then super('I') else super('i')?
  • 没关系,刚刚解决了,我将if语句放在超级构造函数中并使用Character.toLowerCase(c)。感谢朋友的帮助!
猜你喜欢
  • 2014-03-22
  • 1970-01-01
  • 1970-01-01
  • 2019-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多