Композиция и Наследование

Композиция и Наследование

Уровень материала: 🐣 #junior
Выявлять победителя не придётся — оба эти механизма важны и нужны. Хотя для игровой логики композиция и является более предпочтительной. Но всё же важно правильно распознать сценарий применения, во избежание появления мутантов типа FlyingEnemyWithShielвButWithoutGun. Поделюсь своим конспектом по теме — может быть это поможет лучше понять различия.

Дисклеймер: некоторые утверждения для разных языков программирования могут иметь разную степень актуальности.

Наследование

Наследование — механизм, который позволяет описать новый класс на основе существующего (родительского). При этом свойства и функциональность родительского класса заимствуются новым классом.

• Основная задача: задать родство, указать, что объект A является производным от B.

• Основные проблемы: хрупкость, неустойчивость к изменениям, сложность комбинирования.

• Расширение поведения: только на этапе компиляции.

• Основная возможность: "естественный" полиморфизм.

• Сценарий применения: определение идентичности, чем является объект.

• Правило использования: is-a (является)

Примеры:

✅ Cat is an Animal

✅ Axe is a Weapon

❌ Train is a Hat

❌ Dog is a Human

❌ FlyingEnemy is an Enemy (❓)

Композиция

Ассоциация — отношение, которое проявляется в том, что объекты двух классов могут ссылаться один на другой, иметь некоторую связь между друг другом.

Агрегация — частный случай ассоциации, при котором один объект имеет ссылку на другой объект, и оба объекта могут существовать независимо.

Примеры: Car и Passenger, Human и Hat.

Композиция — более строгий вариант агрегации, когда включаемый объект может существовать только как часть основного.

Примеры: Car и Engine, Human и Heart.

• Основная задача: задать возможности, указать, что объект A умеет/имеет x, y и z.

• Основные проблемы: разрастание кол-ва компонентов и сложность управления ими.

• Расширение поведения: во время исполнения.

• Основная возможность: добавление функциональности без изменения базовых классов.

• Сценарий применения: задание поведения и возможностей.

• Правило использования: has-a (имеет)

Примеры:

✅ House has Rooms

✅ Enemy has a FlyingBehaviour

✅ Vehicle has a MovementStrategy

Следствия

Компонентный подход — способ реализации композиции, при котором объект собирается из независимых компонентов, каждый из которых отвечает за отдельную функциональность или данные.

Пример: PlayerObject = MovementBehaviour + JumpBehaviour + HealthBehaviour.

ECS (Entity Component System) — архитектура с плоской иерархией, основанная на принципах композиции, где поведение игровых объектов определяется набором отдельных компонентов, каждый из которых хранит своё состояние и обрабатывается соответствующими системами.

Пример: (MovementComponent + JumpComponent + ...) + (MovementSystem + JumpSystem+ ...)

2
Начать дискуссию