我可以在抽象类中创建静态工厂方法吗?

时间:2017-04-09 22:29:04

标签: java

我正在制作国际象棋游戏并试图弄清楚是否有办法让我的抽象课程#34; Piece"有一个方法返回具体实现的新实例,如Pawn或Rook。

例如:

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

除了返回一个Piece之外,我希望它返回调用该方法的类。所以,如果我调用Pawn.newNorthPiece(),我希望它给我一个新的Pawn(true)。 我想这样做,而不必为扩展Piece类的每个类都编写一个新的工厂方法。

3 个答案:

答案 0 :(得分: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类的子类可以访问子类等等。

答案 1 :(得分:0)

  

我可以在抽象类中创建静态工厂方法吗?

是的,您可以在static类中创建abstract方法,该方法将如下所示:

public abstract class PieceFactory {

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

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

你可以调用PieceFactory.getPiece("Pawn")来返回Pawn的实例。

答案 2 :(得分:-1)

Piece类是abstract,因此您无法实例化它。您需要具有Piece类的具体实现。