Ответ
В 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). Вы обязуетесь предоставить свою реализацию контракта.