このstackexchangeを簡単に検索すると、一般的に構成は継承よりも柔軟であると一般に考えられていますが、常にプロジェクトなどに依存し、継承の方が適している場合があります。3Dチェスゲームを作りたいのですが、各ピースにはメッシュがあり、場合によっては異なるアニメーションなどがあります。この具体的な例では、両方のアプローチのケースが間違っていると主張できるように思われますか?
継承は次のようになります(適切なコンストラクターなどを使用)
class BasePiece
{
virtual Squares GetValidMoveSquares() = 0;
Mesh* mesh;
// Other fields
}
class Pawn : public BasePiece
{
Squares GetValidMoveSquares() override;
}
これは確かに「is-a」の原則に従いますが、構成は次のようになります。
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
}
それは個人的な好みの問題なのか、それともここでの1つのアプローチが他のアプローチより明らかに賢い選択なのか?
編集:私はすべての答えから何かを学んだと思うので、1つだけを選ぶのは気分が悪いです。私の最終的な解決策は、ここのいくつかの投稿からインスピレーションを得ます(まだ取り組んでいます)。回答に時間を割いてくださった皆さんに感謝します。
var Pawn = new Piece(howIMove, howITake, whatILookLike)
私には、継承階層よりもはるかに単純で、管理しやすく、保守しやすいようです。