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