当我想这样做的时候,我已经有过几种情况了。这可能是一个示例:
考虑一种可能的国际象棋游戏实现。我们定义了抽象类‘块’和继承它的类:‘毕晓普’,‘培根’,‘塔’,‘马’,‘皇后’等
我们可能有我们的peon即将到达棋盘的末尾,可能需要调用到peon对象上的方法将该对象的类更改为“皇后”、“马”或其他任何对象。
所以我的问题是,有没有办法在C++或Java中做到这一点?如果不是,用任何其他语言?另外,有没有其他的方法来解决这种情况?
发布于 2012-06-29 21:01:29
您也许能够使用decorator pattern或strategy pattern。
使用装饰器:
interface ChessPiece {
Set<Move> getPossibleMoves();
Image getAppearance();
}
class Pawn implements ChessPiece {
...
}
class Decorator implements ChessPiece {
ChessPiece decorated;
public Decorator(ChessPiece decorated_) {
this.decorated = decorated_;
}
@override
Set<Move> getPossibleMoves() {
Set<Move> result = decorated.getPossibleMoves();
// alter result
return result;
}
}需要时,您可以用Decorated实例替换Pawn实例。因此,正如 answer中提到的那样,它仍然涉及用一个实例替换另一个实例。
ChessPiece pawn = new Pawn;
...
pawn = new Decorated(pawn);当你提前计划的时候,你可以使用策略,它仍然不是真正的改变类
interface PossibleMovesStrategy {
Set<Move> getPossibleMoves();
}
interface AppearanceStrategy {
Image getAppearance();
}
class ChangingChessPiece extends ChessPiece {
PossibleMovesStrategy posMoves;
AppearanceStrategy appearance;
@override
Set<Move> getPossibleMoves() {
return posMoves.getPossibleMoves();
}
@override
Image getAppearance() {
return appearance.getAppearance();
}
}发布于 2012-06-29 21:02:19
在像C++或Java这样的语言中,我会创建一个新的‘皇后’或‘马’实例,并用这个新实例替换'Peon‘实例。
发布于 2012-06-29 21:08:37
我认为你对对象的想法与对象的使用方式混淆了。在面向对象的语言中,我们有指示对象实例的内存位置的指针:
Piece pointerToPieceObject = new Peon();在上面的语句中,pointerToPieceObject是“类型”Piece。由于Peon和Queen都继承自Piece,因此此指针可以指向以下任何类型的对象实例:
pointerToPieceObject = new Queen();这是一个在任何面向对象语言中都支持的非常通用的概念。这些语言之间唯一的区别是如何处理类型(例如,Python和Java )。这个概念叫做多态,可以用来做比上面的例子更奇特的事情:http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming
https://stackoverflow.com/questions/11262245
复制相似问题