Композиция вместо наследования
Выбор конструкции «содержит», когда она подходит
«Композиция вместо наследования» — бесплатный урок Dart Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Dart Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Dart Academy содержит 4 уроков всего.
Два способа повторного использования
Повторно использовать поведение можно через наследование или хранение другого объекта. Второй подход называется композицией.
«Является» и «содержит»
Наследование моделирует связь «является»: Circle — это Shape. Композиция моделирует связь «содержит»: Car содержит Engine.
Класс с композицией
При композиции Вы храните вспомогательный объект в качестве поля и передаёте ему работу вместо наследования от него.
class Car {
final Engine engine = Engine();
}Делегирование поведения
Внешний класс перенаправляет вызовы своему внутреннему объекту. Такое делегирование позволяет повторно использовать логику без наследования.
class Car {
final engine = Engine();
void start() => engine.ignite();
}Проблема хрупкого базового класса
Глубокая иерархия наследования непрочна. Изменение родительского класса может незаметно нарушить работу удалённых подтипов — это ловушка, известная как хрупкий базовый класс.
Гибкость во время выполнения
Композиция позволяет в любой момент заменить внутренний объект. Наследование фиксируется один раз, а поле можно изменить.
class Car {
Engine engine;
Car(this.engine);
}Сочетание с интерфейсами
Сочетайте композицию с интерфейсами: зависите от абстрактного типа Engine, чтобы любой подходящий двигатель можно было легко подключить.
abstract class Engine {
void ignite();
}Удобнее тестировать
Поскольку части являются отдельными объектами, в тестах Вы можете передать поддельный объект. Композиция делает создание заглушек простым и естественным.
var car = Car(FakeEngine());Не наследуйте неподходящие свойства
Подтипы наследуют каждый член родительского класса, даже те, которые не должны предоставляться снаружи. Композиция передаёт только то, что Вы выбираете делегировать.
Когда наследование всё же лучше
Наследование подходит для ясной связи «является» с общей идентичностью. Выбирайте композицию, когда связь на самом деле означает «содержит».
Практическое правило
По умолчанию отдавайте предпочтение композиции, а наследование используйте умеренно. Так проект остаётся слабо связанным и его легче изменять в будущем. 🧩
Быстрая проверка
Один короткий вопрос о композиции.
Итоги
Композиция моделирует отношение «содержит», удерживая другие объекты и делегируя им работу. Она остаётся гибкой и удобной для тестирования, тогда как наследование подходит для ясных связей «является». 👍
Часто задаваемые вопросы
Урок «Композиция вместо наследования» бесплатный?
Да — полный текст урока «Композиция вместо наследования» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Dart Academy, подпишись на CoddyKit PRO. Курс Dart Academy содержит 4 уроков всего.
Чему я научусь в уроке «Композиция вместо наследования»?
Выбор конструкции «содержит», когда она подходит Ты практикуешь Dart Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Dart Academy?
Предыдущий опыт не требуется. Dart Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Композиция вместо наследования»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Dart Academy?
Да. Каждый урок Dart Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Абстрактные классы и методы
- Неявные интерфейсы и implements
- Полиморфизм через общие типы
- Композиция вместо наследования