Аннотация @override
Часть раздела Объектно-ориентированное программирование путешествия по Dart на Coddy. Урок 39 из 110.
Аннотация @override — это маркер лучшей практики, который сообщает Dart (и другим разработчикам), что вы намеренно заменяете метод родительского класса. Хотя переопределение метода работает и без неё, использование @override добавляет важный уровень защиты.
class Animal {
String name;
Animal(this.name);
void speak() {
print('$name makes a sound');
}
}
class Dog extends Animal {
Dog(String name) : super(name);
@override
void speak() {
print('$name barks: Woof!');
}
}Аннотация предоставляет два ключевых преимущества. Во-первых, она ясно документирует ваше намерение — любой, кто читает код, сразу понимает, что этот method существует в parent class. Во-вторых, анализатор Dart предупредит вас, если method в parent фактически не существует, что позволяет на раннем этапе обнаружить опечатки и ошибки рефакторинга.
Рассмотрим, что произойдёт, если вы неправильно напишете имя метода без @override:
class Cat extends Animal {
Cat(String name) : super(name);
void speek() { // Опечатка! Нет предупреждения без @override
print('$name meows');
}
}Без аннотации Dart предполагает, что вы создаёте новый метод с именем speek(). С помощью @override анализатор сразу сообщит об ошибке: такого метода не существует в родительском классе. Эта простая аннотация предотвращает скрытые ошибки, которые впоследствии бывает трудно обнаружить.
Задание
ЛегкоДавайте создадим систему медиаплеера, демонстрирующую важность аннотации @override при настройке унаследованного поведения. Вы создадите различные типы медиа, каждый из которых будет воспроизводить Content своим способом.
Вы организуете код в двух файлах:
media.dart: Определите здесь свою иерархию медиа:- Класс
Mediaсо свойствомString title, конструктором, принимающим заголовок, и методомplay(), который выводитPlaying: [title] - Класс
Song, расширяющийMediaи добавляющий свойствоString artist. Используйте аннотацию@overrideи переопределитеplay(), чтобы выводитьPlaying song: [title] by [artist] - Класс
Video, расширяющийMediaи добавляющий свойствоint duration(в секундах). Используйте@overrideи переопределитеplay(), чтобы сначала вызвать версию parent с помощьюsuper.play(), а затем вывестиDuration: [duration] seconds
- Класс
main.dart: Импортируйте свой медиафайл и продемонстрируйте переопределённые методы:- Создайте объект
Mediaс заголовком'Generic Content'и вызовитеplay() - Выведите пустую строку
- Создайте
Songс заголовком'Imagine'и исполнителем'John Lennon', затем вызовитеplay() - Выведите пустую строку
- Создайте
Videoс заголовком'Dart Tutorial'и длительностью360, затем вызовитеplay()
- Создайте объект
Аннотация @override документирует ваше намерение и помогает обнаруживать ошибки. Если вы случайно напечатаете play() как plya(), аннотация предупредит вас, что в parent class такого метода не существует.
Ожидаемый вывод:
Playing: Generic Content
Playing song: Imagine by John Lennon
Playing: Dart Tutorial
Duration: 360 secondsПопробуйте сами
import 'media.dart';
void main() {
// TODO: Create a Media object with title 'Generic Content' and call play()
// TODO: Выведите пустую строку
// TODO: Создайте Song с названием 'Imagine' и исполнителем 'John Lennon', затем вызовите play()
// TODO: Выведите пустую строку
// TODO: Create a Video with title 'Dart Tutorial' and duration 360, then call play()
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыБиблиотеки и импортВведение в ООПКлассы и объектыКлючевое слово thisМетодыПеременные экземпляраОсновы конструкторовИтоги — Простой калькулятор4Null-безопасность
Введение в Null-безопасностьNullable и Non-Nullable типыОператоры ? и !Ключевое слово Late и Null-безопасностьNull-aware операторыNull-безопасность в классахИтоги — Система профилей пользователей7Абстрактные классы и интерфейсы
Абстрактные классыАбстрактные методыИнтерфейсы в DartНеявные интерфейсыРеализация против наследованияМножественные интерфейсыИтоги — Калькулятор фигур10Коллекции и обобщения
Обзор List, Set, MapТипобезопасные коллекцииОбобщенные классыОбобщенные методыОграничения обобщенийIterable и IteratorИтоги: Обобщенное хранилище13Продвинутые концепции ООП
Композиция против наследованияМетоды расширенияВызываемые классыЗапечатанные классы (Dart 3)Записи (Dart 3)Паттерны и сопоставление (3.0)Перечисления с методами16Проект: Управление библиотекой
Обзор проектаКлассы Book и User2Конструкторы в Dart
Конструктор по умолчаниюИменованные конструкторыСписки инициализацииКонстантные конструкторыФабричные конструкторыПеренаправляющие конструкторыИтоги — Shape Builder5Инкапсуляция
Публичные и приватные членыСоглашение о префиксе _Приватность на уровне библиотекГеттеры и сеттеры: подробный разборСкрытие данныхИтоги — Записи о студентах8Mixins
Введение в MixinsСоздание MixinsИспользование нескольких MixinsКлючевое слово on в MixinsMixin и наследованиеMixin и интерфейсИтоги: Система животных11Специальные методы
Переопределение toString()Переопределение hashCode и ==Интерфейс ComparableМетод call()Переопределение noSuchMethodПовторение — Пользовательская коллекция14Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy3Свойства классов
Члены экземпляра и статические членыПоля Final и ConstПеременные LateСтатические методы и поляГеттеры и сеттерыИтоги — Менеджер банковского счета6Наследование
Основы наследованияКлючевое слово superПереопределение методовАннотация @overrideКлючевое слово final для классовКонструкторы и наследованиеИтоги: Иерархия сотрудников9Полиморфизм
Основы полиморфизмаПолиморфизм через интерфейсыПроверка типов во время выполненияОператоры is и asКлючевое слово covariantИтоги — Обработчик платежей12Асинхронное ООП
Futures и async/awaitОсновы StreamsКонтроллеры StreamАсинхронные конструкторыАсинхронность в методах классовИтоги — Data Fetcher15Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн РепозиторийПотренируйтесь самостоятельно: Онлайн-компилятор Dart