我正在制作国际象棋游戏并试图弄清楚是否有办法让我的抽象课程#34; Piece"有一个方法返回具体实现的新实例,如Pawn或Rook。
例如:
static public Piece newNorthPiece(){
return new Piece(true);
}
除了返回一个Piece之外,我希望它返回调用该方法的类。所以,如果我调用Pawn.newNorthPiece(),我希望它给我一个新的Pawn(true)。 我想这样做,而不必为扩展Piece类的每个类都编写一个新的工厂方法。
答案 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 constructor
,Piece
类的子类可以访问子类等等。
答案 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
类的具体实现。