2010-11-26 41 views
1

我正在做一個國際象棋比賽和每件作品都有一個子類 - 國王,王后,車等如何定義一個構造所有子類

每一塊都有,我想設置這樣一個playerId屬性:

public abstract class Piece { 

    private int playerId; 

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

但是,這隻適用於如果我直接實例化Piece(我不能,因爲它是抽象的)。有沒有辦法讓這個構造函數適用於所有的子類,而不必在每個類中手動實現它?

回答

1

有沒有簡單的方法。在每個後代寫的是這樣的:

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

通常,你的IDE可以爲你做這個。當你擴展Piece時,它應該提供添加所有你需要的構造函數。它仍然需要完成,但不必手動完成。

也許你可以避免通過將其行爲從碎片中分離出來來避免子分類。

enum PieceType { 
    KING, QUEEN, ROOK; 
} 

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

這是個好主意,但每件作品都有我需要管理的其他屬性。我只需在每個類中編寫構造函數:P – Matt 2010-11-26 11:53:27

0

的一種方式(的方式我通常這樣做)是有一個保護片構造

public abstract class Piece { 

    private int playerId; 

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

併爲每subpiece,例如Rook

public class Rook extends Piece { 

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

這樣,Piece的構造函數的確是除了它的後代以外的每個人。

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; 
    } 
} 
相關問題