2017-04-09 96 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

哦,这是一个有趣的解决方案,我会尝试! –

相关问题