Композиция и Наследование
Уровень материала: 🐣 #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+ ...)