Перечисления с методами
Часть раздела Объектно-ориентированное программирование путешествия по Dart на Coddy — урок 88 из 110.
В Dart перечисления (enums) — это не просто списки констант: они могут иметь поля, конструкторы и методы, что превращает их в мощные мини-классы. Это называется улучшенными перечислениями (enhanced enums), и это позволяет привязывать поведение и данные напрямую к каждому значению перечисления.
enum Status {
pending('Waiting'),
approved('Accepted'),
rejected('Denied');
final String displayName;
const Status(this.displayName);
bool get isFinalized => this == approved || this == rejected;
}
void main() {
var status = Status.pending;
print(status.displayName); // Waiting
print(status.isFinalized); // false
print(Status.approved.isFinalized); // true
}Каждое значение enum вызывает конструктор со своими специфическими аргументами. Конструктор должен быть const, а все поля должны быть final. Вы можете добавлять геттеры и методы, которые работают с данными перечисления или сравнивают их с другими значениями.
Улучшенные перечисления также могут реализовывать интерфейсы, что дает им еще больше гибкости:
enum Priority implements Comparable<Priority> {
low(1),
medium(2),
high(3);
final int level;
const Priority(this.level);
@override
int compareTo(Priority other) => level.compareTo(other.level);
}
void main() {
var tasks = [Priority.high, Priority.low, Priority.medium];
tasks.sort();
print(tasks); // [Priority.low, Priority.medium, Priority.high]
}Улучшенные перечисления идеальны, когда у вас есть фиксированный набор значений, каждому из которых требуются связанные данные или поведение — например, коды состояния с сообщениями, приоритеты с уровнями или направления с координатами.
Задание
ЛегкоДавайте создадим систему управления задачами, используя расширенные перечисления (enhanced enums)! Вы создадите enum, который представляет различные категории задач, каждая из которых имеет свои собственные свойства и поведение, помогающие организовывать и приоритизировать работу.
Вы организуете свой код в двух файлах:
task_category.dart: Создайте расширенный enum с названиемTaskCategory, который представляет различные типы задач в проекте. Каждая категория должна иметь:- Поле
String labelдля человекочитаемого названия - Поле
int priority(1 — наивысший приоритет, 3 — самый низкий) - Конструктор
const, который инициализирует оба поля - Четыре значения enum:
bug(label: "Bug Fix", priority: 1),feature(label: "New Feature", priority: 2),documentation(label: "Documentation", priority: 3) иtesting(label: "Testing", priority: 2) - Геттер
isUrgent, который возвращаетtrue, если приоритет равен 1 - Метод
describe(), который возвращает строку в формате:[label] (Priority: [priority])
Comparable<TaskCategory>, чтобы задачи можно было сортировать по приоритету (меньшее число приоритета = идет первым).- Поле
main.dart: Импортируйте ваш enum категорий задач и продемонстрируйте его возможности:- Создайте список, содержащий все четыре категории задач в следующем порядке:
feature,bug,documentation,testing - Выведите описание каждой категории, используя метод
describe(), по одному на строку - Выведите пустую строку
- Отсортируйте список по приоритету и выведите
After sorting by priority: - Выведите label каждой отсортированной категории, по одному на строку
- Выведите пустую строку
- Выведите
Urgent tasks: - Пройдите циклом по исходному порядку (
feature,bug,documentation,testing) и выведите только label тех категорий, гдеisUrgentравно true
- Создайте список, содержащий все четыре категории задач в следующем порядке:
Этот челлендж объединяет возможности расширенных enum: поля, конструкторы, геттеры, методы и реализацию интерфейсов — все это работает вместе для создания полезной системы категоризации задач!
Ожидаемый вывод:
New Feature (Priority: 2)
Bug Fix (Priority: 1)
Documentation (Priority: 3)
Testing (Priority: 2)
After sorting by priority:
Bug Fix
New Feature
Testing
Documentation
Urgent tasks:
Bug FixШпаргалка
Улучшенные перечисления (enhanced enums) в Dart могут иметь поля, конструкторы и методы, что делает их мощными мини-классами, которые связывают поведение и данные с каждым значением перечисления.
Базовое улучшенное перечисление с полями и конструктором:
enum Status {
pending('Waiting'),
approved('Accepted'),
rejected('Denied');
final String displayName;
const Status(this.displayName);
}Ключевые требования:
- Конструктор должен быть
const - Все поля должны быть
final - Каждое значение перечисления вызывает конструктор с определенными аргументами
Улучшенные перечисления могут включать геттеры и методы:
enum Status {
pending('Waiting'),
approved('Accepted'),
rejected('Denied');
final String displayName;
const Status(this.displayName);
bool get isFinalized => this == approved || this == rejected;
}Улучшенные перечисления могут реализовывать интерфейсы, такие как Comparable:
enum Priority implements Comparable<Priority> {
low(1),
medium(2),
high(3);
final int level;
const Priority(this.level);
@override
int compareTo(Priority other) => level.compareTo(other.level);
}Используйте улучшенные перечисления, когда у вас есть фиксированный набор значений, каждому из которых требуются связанные данные или поведение.
Попробуйте сами
import 'task_category.dart';
void main() {
// TODO: Создайте список, содержащий все четыре категории задач в этом порядке:
// feature, bug, documentation, testing
// TODO: Выведите описание каждой категории с помощью describe(), по одному на строку
// TODO: Выведите пустую строку
// TODO: Отсортируйте список по priority
// TODO: Выведите "After sorting by priority:"
// TODO: Выведите label каждой отсортированной категории, по одному на строку
// TODO: Выведите пустую строку
// TODO: Выведите "Urgent tasks:"
// TODO: Пройдите циклом по исходному порядку (feature, bug, documentation, testing)
// и выведите только label категорий, где isUrgent имеет значение true
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
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
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн Репозиторий