Что такое ключевое слово extends в Dart?

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

Ответ

extends — это ключевое слово в Dart, используемое для создания подкласса (наследника) от другого класса (суперкласса или родителя). Наследник получает все публичные и защищенные (protected через конвенцию _) поля и методы родителя, может их переопределять и добавлять новые.

Основные принципы:

  • Одиночное наследование: Класс может наследовать только от одного суперкласса.
  • Переопределение методов: Используется аннотация @override.
  • Конструкторы: Конструктор родителя вызывается с помощью super() в теле конструктора наследника.

Практический пример из Flutter: Создание кастомного виджета с дополнительной логикой.

// Базовый класс для всех экранов в приложении
abstract class BaseScreen extends StatelessWidget {
  final String screenTitle;
  const BaseScreen({required this.screenTitle, Key? key}) : super(key: key);

  // Общий метод для всех экранов
  AppBar buildAppBar(BuildContext context) {
    return AppBar(
      title: Text(screenTitle),
      centerTitle: true,
    );
  }

  // Абстрактный метод, который должны реализовать наследники
  Widget buildBody(BuildContext context);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: buildAppBar(context),
      body: buildBody(context),
    );
  }
}

// Конкретный экран, наследующий общую структуру
class HomeScreen extends BaseScreen {
  const HomeScreen({Key? key}) : super(screenTitle: 'Главная', key: key);

  @override
  Widget buildBody(BuildContext context) {
    return Center(
      child: ElevatedButton(
        onPressed: () {},
        child: Text('Действие'),
      ),
    );
  }

  // Можно переопределить и метод родителя
  @override
  AppBar buildAppBar(BuildContext context) {
    final defaultAppBar = super.buildAppBar(context);
    return AppBar(
      title: defaultAppBar.title,
      actions: [IconButton(onPressed: () {}, icon: Icon(Icons.settings))],
    );
  }
}

Итог: extends — фундаментальный механизм для повторного использования кода и построения иерархий в объектно-ориентированном Dart.