带方法的枚举
本课属于 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]
}当你有一组固定的值,并且每个值都需要关联数据或行为时,增强型枚举就很合适,例如带有消息的状态码、带有级别的优先级,或带有坐标的方向。
挑战
简单让我们使用增强枚举构建一个任务管理系统!你将创建一个表示不同任务类别的枚举,每个类别都有自己的属性和行为,帮助你组织工作并确定优先级。
你将把代码分成两个文件:
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 的类别的标签
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Dart 在线编译器