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

Java 如何为所有子类定义构造函数,java,oop,Java,Oop,我正在做一个国际象棋游戏,每一个棋子都有一个子类——国王、王后、车等等 每件作品都有一个playerId属性,我想这样设置: public abstract class Piece { private int playerId; public Piece(int playerId) { this.playerId = playerId; } } public Rook(int playerId) { super(playerId); } 但

我正在做一个国际象棋游戏,每一个棋子都有一个子类——国王、王后、车等等

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

public abstract class Piece {

    private int playerId;

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

但这只有在我直接实例化这个片段的情况下才有效(反正我不能,因为它是抽象的)。有没有一种方法可以使此构造函数应用于所有子类,而不必在每个类中手动实现它?

通常,您的IDE可以为您这样做。当您扩展工件时,它应该提供添加您需要的所有构造函数的功能。它仍然需要执行,但避免了手动执行

也许您可以通过将其行为与片段分开来避免对片段进行细分

enum PieceType {
  KING, QUEEN, ROOK;
}

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

没有简单的方法。在每个子代中,写下如下内容:

public abstract class Piece {

    private int playerId;

    public Piece(int playerId) {
        this.playerId = playerId;
    }
}
public Rook(int playerId) {
    super(playerId);
}
一种方法(我通常这样做的方式)是使用受保护的片段构造函数

public abstract class Piece {

    private int playerId;

    protected Piece(int playerId) {
        this.playerId = playerId;
    }
}
对于每一个子片段,例如Rook

public class Rook extends Piece {

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

这样的话,
Piece
的构造函数对每个人来说都很有用,除了它的后代。

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

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

这是个好主意,但每件作品都有我需要管理的其他属性。我将在每个类中编写构造函数:P@matt,如果您使用的是IDE,您真的不需要这样做。您能否举例说明需要管理的其他属性?您可能会发现enum的功能远远超出您的预期。第二个建议是非常非面向对象的设计。我宁愿使用piece.getValidMoves()之类的多态方法,也不愿使用大量switch语句。