我正在制作一个国际象棋游戏,每个棋子都有一个子类 - 国王,女王,鲁克等
每件都有一个playerId属性,我想这样设置:
public abstract class Piece {
private int playerId;
public Piece(int playerId) {
this.playerId = playerId;
}
}
但这只有在我直接实例化片段时才有效(我无论如何都不能,因为它是抽象的)。有没有办法使这个构造函数适用于所有子类,而不必在每个类中手动实现它?
答案 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
的构造函数确实是除了它的后代之外的所有人。