В чем разница между `implements` и `extends` в Dart?

«В чем разница между `implements` и `extends` в Dart?» — вопрос из категории ООП, который задают на 36% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Dart extends и implements служат для разных целей наследования и реализации.

extends (наследование класса)

Используется для создания подкласса. Новый класс наследует все поля и методы родительского класса (и абстрактные, и реализованные). Поддерживает только одиночное наследование.

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

class Dog extends Animal {
  void bark() => print('Woof!');
  // Наследует метод breathe()
}

void main() {
  var dog = Dog();
  dog.breathe(); // Вывод: Breathing...
  dog.bark();    // Вывод: Woof!
}

implements (реализация интерфейса)

Обязывает класс предоставить собственную реализацию всех публичных членов (полей и методов) другого класса или интерфейса. Позволяет реализовать несколько интерфейсов.

abstract class Flyable {
  void fly();
}

abstract class Swimmable {
  void swim();
}

class Duck implements Flyable, Swimmable {
  @override
  void fly() => print('Duck is flying');

  @override
  void swim() => print('Duck is swimming');
}

Ключевое отличие:

  • extends — это отношение "является" (Dog является Animal). Вы получаете готовую реализацию.
  • implements — это отношение "ведёт себя как" (Duck ведёт себя как Flyable и Swimmable). Вы обязуетесь предоставить свою реализацию контракта.