Menu
Coddy logo textTech

Реализация против наследования

Часть раздела Объектно-ориентированное программирование путешествия по Dart на Coddy. Урок 47 из 110.

Теперь, когда вы понимаете и extends, и implements, давайте уточним, когда использовать каждый из них.

Используйте extends, когда хотите унаследовать behavior. Ваш подкласс получает весь код родительского класса бесплатно и может развивать его:

class Animal {
  void breathe() {
    print('Breathing...');
  }
}

class Dog extends Animal {
  void bark() {
    print('Woof!');
  }
}

void main() {
  var dog = Dog();
  dog.breathe();  // Унаследовано — работает автоматически
  dog.bark();
}

Используйте implements, когда хотите гарантировать структуру без наследования кода. Вы должны написать каждый метод самостоятельно:

class Robot implements Animal {
  @override
  void breathe() {
    print('Ventilating circuits...');  // Полностью кастомная реализация
  }
}

Ключевое различие: extends означает «я являюсь типом этого», тогда как implements означает «я умею делать то же, что и это». Dog — это Animal, и он дышит так же. Robot — не животное, но он может выполнять тот же контракт, используя собственную логику.

Помни: ты можешь расширить только один класс, но можешь реализовать множество интерфейсов. Выбирай extends для настоящих отношений наследования, а implements — когда тебе нужна гибкость или ты хочешь обеспечить соблюдение контракта без совместного использования деталей реализации.

challenge icon

Задание

Легко

Давайте создадим систему работников, которая демонстрирует, когда использовать extends, а когда — implements. Вы создадите базовый класс работника, а затем покажете оба подхода: один класс действительно «является» работником и наследует поведение, а другой просто «может делать» то, что делает работник, но использует полностью custom логику.

Вы организуете код в двух файлах:

  • worker.dart: Определите здесь иерархию работников:
    • Класс Worker со свойством String name и конструктором. Включите метод work(), который выводит [name] is working..., и метод takeBreak(), который выводит [name] takes a coffee break
    • Класс OfficeWorker, который extends Worker. Добавьте свойство String department. Переопределите work(), чтобы он выводил [name] is typing reports in [department], но сохраните inherited поведение takeBreak()
    • Класс RobotWorker, который implements Worker. Добавьте свойство String model. Поскольку роботы на самом деле не являются работниками, но могут делать то, что делают работники, предоставьте Completely custom реализации: work() должен выводить Robot [model] is assembling parts, а takeBreak() должен выводить Robot [model] is recharging
  • main.dart: Импортируйте файл работника и продемонстрируйте оба подхода:
    • Создайте OfficeWorker с именем 'Alice' в отделе 'Marketing'
    • Создайте RobotWorker с моделью 'RX-7'
    • Для офисного работника вызовите work(), затем takeBreak()
    • Выведите пустую строку
    • Для робота-работника вызовите work(), затем takeBreak()

Обратите внимание, как OfficeWorker автоматически наследует takeBreak(), потому что он extends Worker — он действительно «является» работником. В то же время RobotWorker must предоставить собственную реализацию для всего, потому что он только implements интерфейс — он «может делать» то, что делает работник, но по-своему, по-роботизированному.

Ожидаемый вывод:

Alice is typing reports in Marketing
Alice takes a coffee break

Robot RX-7 is assembling parts
Robot RX-7 is recharging

Попробуйте сами

import 'worker.dart';

void main() {
  // TODO: Создайте OfficeWorker по имени 'Alice' в отделе 'Marketing'
  
  // TODO: Создайте RobotWorker с моделью 'RX-7'
  
  // TODO: Для офисного работника вызовите work(), затем takeBreak()
  
  // TODO: Выведите пустую строку
  
  // TODO: Для робота-работника вызовите work(), затем takeBreak()
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор Dart