2017-04-09 97 views
0

我正在製作一款象棋遊戲,並試圖弄清楚是否有辦法讓我的抽象類「Piece」有一種方法可以返回像Pawn或Rook這樣的具體實現的新實例。我可以在抽象類中創建靜態工廠方法嗎?

例如:

static public Piece newNorthPiece(){ 
     return new Piece(true); 
    } 

除,而不是返回一塊我希望它返回任何調用該方法的類。所以如果我打電話給Pawn.newNorthPiece()我希望它返回給我一個新的Pawn(true)。 我想這樣做,而不必爲擴展Piece類的每個類都寫一個新的工廠方法。

+0

您需要調用具體的實現。因此無論是'KnightPiece','PawnPiece'等。您的工廠方法應該確定要調用哪個實現。你有沒有定義Pawn? – Obicere

+0

我相當肯定這是不可能的。超類不知道它的子類。真正的問題是爲什麼你不想爲每個班級寫一個新的工廠方法。 – Gendarme

+0

Obicere我不確定你的意思,但是我已經爲所有作品製作了課程。 –

回答

0

在Java中,你不能這樣做super class不知道有多少classes正在擴展它。你可以得到它最接近的是通過實施這樣的方法:

class Piece { 
    public static Piece getInstance(Class<? extends Piece> clazz) throws InstantiationException, IllegalAccessException{ 
     return clazz.newInstance(); 
    } 
} 

class Pawn extends Piece { 

} 

然後,您可以調用該方法,並通過Piece的階級是這樣的:

Piece piece = Piece.getInstance(Pawn.class); 

這會給你的實例Pawn類,您可以使用它來獲取任何其他類的實例,該類延伸Piece

P.S.這取決於幾個因素(例如其子類public constructorPiece類有機會獲得兒童類等)在抽象類

+0

這似乎是最接近我到目前爲止,我的想法,偉大的想法! –

+1

@OdinThorsen這也將有助於驗證所有'Piece'實現至少有一個'public'構造函數作爲實例將不會被創建。 –

-1

Piece類是abstract,所以你不能實例化它。你需要具體實現你的Piece類。

0

我可以做一個靜態工廠方法?

是的,你可以在裏面abstract類中創建一個static方法和方法看下面:

public abstract class PieceFactory { 

    public static Piece getPiece(String pieceType){ 
     switch(pieceType) { 
      case NorthPiece: 
        return new NorthPiece(); 

      case Pawn: 
        return new Pawn(); 
      } 
    } 
} 

你可以叫whichn返回Pawn實例的PieceFactory.getPiece("Pawn")

+0

不是我正在尋找的,因爲我希望Piece類不知道什麼類會擴展它。我很欣賞這個建議:) –

+0

這是一個'PieceFactory',而不是'Piece',請現在看看上面的代碼 – developer

+0

哦,這是一個有趣的解決方案,我會嘗試! –

相關問題