我是java的新手,正在尝试构建运行国际象棋游戏的逻辑。我有一个名为'Piece'的超类和王,骑士,女王等的子类。我正在尝试实现一种移动方法,我在那里确定片段的类型,然后调用该片段的相应移动方法。例如:
int typeOfPiece = _board[startX][startY]._theKind;
Piece myPiece;
switch(typeOfPiece)
{
case 1:
myPiece = new Pawn(startX, startY, team);
case 2:
myPiece = new Rook(startX, startY, team);
case 3:
myPiece = new Knight(startX, startY, team);
}
boolean myPiece.canMove(endX, endY);
有没有办法可以确保在这个例子中正确的类型片段会调用canMove方法?
由于
答案 0 :(得分:4)
如果您的主板会保留Piece
个对象而不是int
个值,那么您可以这样做:
Piece piece = _board[x][y];
piece.canMove(...);
Piece
类将定义canMove
方法,其所有子类将使用自己的策略实现。
答案 1 :(得分:3)
覆盖所有子类中的canMove
,并在父类Piece
中将其抽象化。
答案 2 :(得分:0)
如果您的子类覆盖超类'Piece'上的canMove方法,myPiece.canMove(endX,endY)就足够了。基于myPiece引用指向的对象类型,在运行时jvm将决定它应该调用哪个方法。这称为动态方法调度
答案 3 :(得分:0)
我要做的是创建一个表示Piece
对象的行为和属性的抽象类或接口。
然后我会有一些类来实现/扩展piece类,每个类用canMove
方法表示它们自己的行为。
您实例化对象,然后在代码中,只需将Piece
对象驻留在位置(x,y)并调用canMove
。这会将行为委托给适当的子类,使您的代码更清晰,更易于维护和灵活。
拥有一个抽象类或接口,而不是具有Piece
对象的具体类,(在我看来)是优势,因为它强制每个部分实现这样的行为,而不是简单地继承它。
答案 4 :(得分:0)
您可以将enum
用作Piece
工厂。这样您就可以避免使用1 means Pawn, ...
等,因为您有Pieces.Pawn
等。请注意,您仍然可以enum
名为Pawn
而class
名为Pawn
{1}}没有含糊之处。
private abstract static class Piece {
// Current position.
protected int x, y;
// Returns true if this piece could move there.
abstract boolean canMove ( int x, int y);
}
private static class Pawn extends Piece {
@Override
boolean canMove (int toX, int toY) {
// Not handling en-passant and first-move etc.
return toX == x && (toY == y + 1 || toY == y + 2);
}
}
private static class Rook extends Piece {
@Override
boolean canMove (int toX, int toY) {
return toX == x || toY == y;
}
}
// A Piece factory.
private static enum Pieces {
Pawn {
@Override
Piece make () {
return new Pawn();
}
},
Rook{
@Override
Piece make () {
return new Rook();
}
};
abstract Piece make();
}
// Make a Piece.
private static Piece makePiece ( Pieces type ) {
return type.make();
}
答案 5 :(得分:0)
我建议你使用Enum来实现一个抽象类Piece而不是一个2d的int数组来代表董事会Example。你可以通过这样做来避免magic numbers。
答案 6 :(得分:0)
您在问题中所做的并不是真正利用多态性,因为您正在通过程序代码决定该片段的类型。
我建议你稍微改变你的设计:每次尝试移动它时,不要为每个部件创建一个新实例,而是创建两个所有部分的部分(黑色和白色)。让棋盘存储对棋子的引用,以便您可以直接从棋盘中检索棋子的实例。
从抽象基类Piece derrive Pawns和其他实现抽象方法的字符canMove()