Швидкий пошук цієї ставки обміну показує, що загалом склад вважається більш гнучким, ніж спадкування, але, як завжди, це залежить від проекту тощо. І є випадки, коли успадкування є кращим вибором. Я хочу зробити 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)
мені здається набагато простішим, більш керованим і більш досяжним, ніж ієрархія спадщини.