如何为所有子类定义构造函数

时间:2010-11-26 11:46:53

标签: java oop

我正在制作一个国际象棋游戏,每个棋子都有一个子类 - 国王,女王,鲁克等

每件都有一个playerId属性,我想这样设置:

public abstract class Piece {

    private int playerId;

    public Piece(int playerId) {
        this.playerId = playerId;
    }
}

但这只有在我直接实例化片段时才有效(我无论如何都不能,因为它是抽象的)。有没有办法使这个构造函数适用于所有子类,而不必在每个类中手动实现它?

4 个答案:

答案 0 :(得分:1)

通常,您的IDE可以为您执行此操作。当您扩展Piece时,它应该提供添加所需的所有构造函数。它仍然需要完成,但避免必须手动完成。

也许你可以通过从Pieces中分离它的行为来避免对Piece进行子类化。

enum PieceType {
  KING, QUEEN, ROOK;
}

public class Piece {
  private final PieceType pieceType;
  private final String playerId;
  public Piece ... // one constructor for all.
}

答案 1 :(得分:1)

没有简单的方法。在每个后代写下这样的东西:

public Rook(int playerId) {
    super(playerId);
}

答案 2 :(得分:1)

您可能想要考虑静态工厂方法。

public abstract class Piece
{
  private int playerId;

  public int getPlayerId()
  {
    return playerId;
  }

  public int setPlayerId(int playerId)
  {
    this.playerId = playerId;
  }
}

public class King extends Piece
{
  //King specific stuff in here
}

public class ChessFactory
{
  public static King newKing(int id)
  {
    King king = new King();
    king.setId(id);
    return king;
  }
}

答案 3 :(得分:0)

一种方式(我通常这样做的方式)是拥有一个受保护的片段构造函数

public abstract class Piece {

    private int playerId;

    protected Piece(int playerId) {
        this.playerId = playerId;
    }
}

并且对于每个子件,例如鲁克

public class Rook extends Piece {

    public Rook(int playerId) {
        super(playerId);
    }
}

这样,Piece的构造函数确实是除了它的后代之外的所有人。