Быстрый поиск этого стека обмена показывает, что в целом состав обычно считается более гибким, чем наследование, но, как всегда, это зависит от проекта и т. Д., И бывают случаи, когда наследование является лучшим выбором. Я хочу создать трехмерную шахматную игру, в которой каждая фигура имеет сетку, возможно, различные анимации и так далее. В этом конкретном примере кажется, что вы могли бы аргументировать оба подхода, я не прав?
Наследование будет выглядеть примерно так (с правильным конструктором и т. Д.)
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)
мне кажется намного проще, более управляемым и более обслуживаемым, чем иерархия наследования.