2017-04-09 20 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の数がわからないため、これを行うことはできません。これはあなたのインスタンスを与える

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

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

class Pawn extends Piece { 

} 

あなたは、メソッドを呼び出すと、このようなPieceのクラスを渡すことができます:あなたはそれを得ることができる最も近いが、このようなメソッドを実装することですPawnクラスの場合、これを使用して、Pieceを拡張する他のクラスのインスタンスを取得できます。

P.S.これが要因のカップル(public constructorを持つ例えば子クラス、子クラスなどへのアクセス権を持つPieceクラス)

+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(); 
      } 
    } 
} 

をそして、あなたはPawnのインスタンスを返すwhichn PieceFactory.getPiece("Pawn")を呼び出すことができます。

+0

Pieceクラスがどのクラスを拡張しているのかわからないので、私が探していたものではありません。とにかくこの提案に感謝します:) –

+0

これは 'Piece'ではなく' PieceFactory'です。今度は上記のコードを見てください – developer

+0

ああ、それは面白い解決策です、私はそれを試してみましょう! –

関連する問題