Menu
CoddyTech

带方法的枚举

本课属于 Coddy Dart 学习旅程的“面向对象编程”单元。第 88 课,共 110 课。

在 Dart 中,枚举不只是简单的常量列表,它们还可以有字段、构造函数和方法,因此能成为功能强大的迷你类。这称为增强枚举,你可以直接为每个枚举值添加行为和数据。

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
}

每个枚举值都会使用特定的参数调用构造函数。构造函数必须是 const,所有字段都必须是 final。你可以添加 getter 和方法,用来处理枚举的数据或与其他值进行比较。

增强枚举还可以实现接口,从而拥有更大的灵活性:

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

挑战

简单

让我们使用增强枚举构建一个任务管理系统!你将创建一个表示不同任务类别的枚举,每个类别都有自己的属性和行为,帮助你组织工作并确定优先级。

你将把代码分成两个文件:

  • task_category.dart:创建一个名为 TaskCategory 的增强枚举,用来表示项目中的不同任务类型。每个类别都应包含:
    • 一个 String label 字段,用于存储易于理解的名称
    • 一个 int priority 字段(1 表示最高优先级,3 表示最低优先级)
    • 一个用于初始化这两个字段的 const 构造函数
    • 四个枚举值:bug(label: "Bug Fix",priority: 1)、feature(label: "New Feature",priority: 2)、documentation(label: "Documentation",priority: 3)和 testing(label: "Testing",priority: 2)
    • 一个 getter isUrgent,当优先级为 1 时返回 true
    • 一个方法 describe(),返回格式为 [label] (Priority: [priority]) 的字符串
    你的枚举还应实现 Comparable<TaskCategory>,以便按优先级对任务排序(优先级数字越小,排序越靠前)。
  • main.dart:导入你的任务类别枚举,并演示它的功能:
    • 创建一个列表,按以下顺序包含全部四个任务类别:feature、bug、documentation、testing
    • 使用 describe() 方法打印每个类别的描述,每行一个
    • 打印一个空行
    • 按优先级对列表排序,并打印 After sorting by priority:
    • 打印排序后每个类别的标签,每行一个
    • 打印一个空行
    • 打印 Urgent tasks:
    • 按原有顺序(feature、bug、documentation、testing)遍历,并只打印 isUrgent 为 true 的类别标签

这个挑战结合了增强枚举的多项功能:字段、构造函数、getter、方法和接口实现,共同构建一个实用的任务分类系统!

预期输出:

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

亲手试试

import 'task_category.dart';

void main() {
  // TODO: 按以下顺序创建一个包含全部四种任务类别的列表:
  // feature, bug, documentation, testing
  
  // TODO: 使用 describe() 打印每个类别的描述,每行一个
  
  // TODO: 打印一个空行
  
  // TODO: 按优先级对列表排序
  
  // TODO: 打印 "After sorting by priority:"
  
  // TODO: 打印排序后每个类别的标签,每行一个
  
  // TODO: 打印一个空行
  
  // TODO: 打印 "Urgent tasks:"
  
  // TODO: 按原始顺序(feature, bug, documentation, testing)遍历
  // 只打印 isUrgent 为 true 的类别的标签
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: Dart 在线编译器