Menu
Coddy logo textTech

Перечисления с методами

Часть раздела Объектно-ориентированное программирование путешествия по 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]
}

Улучшенные перечисления идеальны, когда у вас есть фиксированный набор значений, каждому из которых требуются связанные данные или поведение — например, коды состояния с сообщениями, приоритеты с уровнями или направления с координатами.

challenge icon

Задание

Легко

Давайте создадим систему управления задачами, используя расширенные перечисления (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])
    Ваш enum также должен реализовывать 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
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование