快速搜索此堆栈交换显示,通常认为合成比继承更灵活,但与往常一样,它取决于项目等,并且有时继承是更好的选择。我想制作一个3D象棋游戏,其中每个棋子都有一个网格,可能有不同的动画等等。在这个具体的例子中,似乎您可以为两种方法都辩护,我错了吗?
继承看起来像这样(使用适当的构造函数等)
class BasePiece
{
virtual Squares GetValidMoveSquares() = 0;
Mesh* mesh;
// Other fields
}
class Pawn : public BasePiece
{
Squares GetValidMoveSquares() override;
}
当然遵循“是”原则,而构图看起来像这样
class MovementComponent
{
virtual Squares GetValidMoveSquares() = 0;
}
class PawnMovementComponent
{
Squares GetValidMoveSquares() override;
}
enum class Type
{
PAWN,
BISHOP, //etc
}
class Piece
{
MovementComponent* movementComponent;
MeshComponent* mesh;
Type type;
// Other fields
}
它是更多是出于个人喜好,还是一种方法显然比其他方法更聪明?
编辑:我认为我从每个答案中都学到了一些东西,所以我为只选择一个而感到难过。我的最终解决方案将从此处的几篇文章中获得启发(仍在努力中)。感谢所有花时间回答的人。
var Pawn = new Piece(howIMove, howITake, whatILookLike)
与继承层次结构相比,对我来说似乎更简单,更易于管理和维护。