Enum có phương thức
Thuộc phần Lập trình hướng đối tượng trong hành trình Dart của Coddy. Bài học 88 trên 110.
Trong Dart, enum không chỉ là danh sách hằng số đơn giản, chúng còn có thể có thuộc tính, hàm khởi tạo và phương thức, khiến chúng trở thành những lớp nhỏ mạnh mẽ. Đây gọi là enum mở rộng, cho phép bạn gắn hành vi và dữ liệu trực tiếp vào từng giá trị enum.
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
}Mỗi giá trị enum gọi hàm khởi tạo với các đối số riêng. Hàm khởi tạo phải là const, và tất cả các trường phải là final. Bạn có thể thêm getter và phương thức để xử lý dữ liệu của enum hoặc so sánh với các giá trị khác.
Enum nâng cao cũng có thể triển khai giao diện, nhờ đó linh hoạt hơn nữa:
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]
}Enum mở rộng rất phù hợp khi bạn có một tập hợp giá trị cố định và mỗi giá trị cần dữ liệu hoặc hành vi đi kèm, như mã trạng thái cùng thông báo, mức độ ưu tiên cùng cấp độ hoặc hướng cùng tọa độ.
Thử thách
DễHãy xây dựng hệ thống quản lý nhiệm vụ bằng enum mở rộng! Bạn sẽ tạo một enum đại diện cho các danh mục nhiệm vụ khác nhau, mỗi danh mục có thuộc tính và hành vi riêng để giúp sắp xếp và ưu tiên công việc.
Bạn sẽ sắp xếp code vào hai tệp:
task_category.dart: Tạo một enum mở rộng có tênTaskCategoryđể đại diện cho các loại nhiệm vụ khác nhau trong một dự án. Mỗi danh mục cần có:- Một trường
String labelđể lưu tên dễ hiểu - Một trường
int priority(1 là mức ưu tiên cao nhất, 3 là mức ưu tiên thấp nhất) - Một hàm khởi tạo
constđể khởi tạo cả hai trường - Bốn giá trị enum:
bug(nhãn: "Bug Fix", mức ưu tiên: 1),feature(nhãn: "New Feature", mức ưu tiên: 2),documentation(nhãn: "Documentation", mức ưu tiên: 3) vàtesting(nhãn: "Testing", mức ưu tiên: 2) - Một getter
isUrgenttrả vềtruenếu mức ưu tiên là 1 - Một phương thức
describe()trả về chuỗi theo định dạng:[label] (Priority: [priority])
Comparable<TaskCategory>để có thể sắp xếp nhiệm vụ theo mức ưu tiên (số ưu tiên thấp hơn sẽ đứng trước).- Một trường
main.dart: Nhập enum danh mục nhiệm vụ và minh họa các chức năng của enum:- Tạo một danh sách chứa cả bốn danh mục nhiệm vụ theo thứ tự này:
feature,bug,documentation,testing - In mô tả của từng danh mục bằng phương thức
describe(), mỗi mô tả trên một dòng - In một dòng trống
- Sắp xếp danh sách theo mức ưu tiên rồi in
After sorting by priority: - In nhãn của từng danh mục sau khi sắp xếp, mỗi nhãn trên một dòng
- In một dòng trống
- In
Urgent tasks: - Lặp qua danh sách theo thứ tự ban đầu (
feature,bug,documentation,testing) và chỉ in nhãn của những danh mục cóisUrgentlàtrue
- Tạo một danh sách chứa cả bốn danh mục nhiệm vụ theo thứ tự này:
Thử thách này kết hợp các tính năng của enum mở rộng: trường, hàm khởi tạo, getter, phương thức và triển khai giao diện, tất cả cùng hoạt động để tạo nên một hệ thống phân loại nhiệm vụ hữu ích!
Đầu ra mong đợi:
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 FixTự làm thử
import 'task_category.dart';
void main() {
// TODO: Tạo danh sách gồm cả bốn loại tác vụ theo thứ tự sau:
// feature, bug, documentation, testing
// TODO: Dùng describe() để in ra mô tả của từng loại, mỗi loại một dòng
// TODO: In ra một dòng trống
// TODO: Sắp xếp danh sách theo mức độ ưu tiên
// TODO: In ra "After sorting by priority:"
// TODO: In ra nhãn của từng loại sau khi sắp xếp, mỗi loại một dòng
// TODO: In ra một dòng trống
// TODO: In ra "Urgent tasks:"
// TODO: Lặp qua thứ tự ban đầu (feature, bug, documentation, testing)
// và chỉ in ra nhãn của những loại có isUrgent là true
}
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Lập trình hướng đối tượng
1Nền tảng về lập trình hướng đối tượng
Tệp bên ngoàiThư viện và câu lệnh importGiới thiệu về lập trình hướng đối tượngLớp và đối tượngTừ khóa thisPhương thứcBiến thể hiệnKiến thức cơ bản về hàm khởi tạoÔn tập: Máy tính đơn giản4An toàn với giá trị null
Giới thiệu về an toàn với giá trị nullCó thể null và không thể nullToán tử ? và !Từ khóa late và an toàn với giá trị nullToán tử xử lý nullAn toàn với giá trị null trong lớpÔn tập: hệ thống hồ sơ người dùng7Lớp trừu tượng và interface
Lớp trừu tượngPhương thức trừu tượngInterface trong DartInterface ngầm địnhTriển khai và kế thừaNhiều interfaceÔn tập: Máy tính hình10Bộ sưu tập và kiểu tổng quát
Tổng quan về List, Set và MapBộ sưu tập an toàn về kiểuLớp tổng quátPhương thức tổng quátRàng buộc kiểu tổng quátIterable và IteratorÔn tập: Lưu trữ tổng quát13Khái niệm OOP nâng cao
Composition và kế thừaPhương thức mở rộngLớp có thể gọiLớp sealed (Dart 3)Records (Dart 3)Mẫu và đối sánh (3.0)Enum có phương thức2Hàm khởi tạo trong Dart
Hàm khởi tạo mặc địnhHàm khởi tạo có tênDanh sách khởi tạoHàm khởi tạo hằng sốHàm khởi tạo nhà máyHàm khởi tạo chuyển hướngÔn tập: Trình tạo hình dạng5Đóng gói
Thành viên công khai và riêng tưQuy ước tiền tố _Tính riêng tư ở cấp thư việnTìm hiểu sâu về getter và setterChe giấu thông tinÔn tập: hồ sơ học sinh8Mixin
Giới thiệu về MixinTạo MixinSử dụng nhiều MixinTừ khóa on trong MixinMixin và kế thừaMixin và giao diệnÔn tập: hệ thống động vật3Thuộc tính của lớp
Thành viên instance và thành viên tĩnhTrường final và constBiến latePhương thức và trường tĩnhGetter và setterÔn tập: trình quản lý tài khoản ngân hàng6Kế thừa
Kế thừa cơ bảnTừ khóa superGhi đè phương thứcChú thích @overrideTừ khóa lớp finalHàm khởi tạo và kế thừaÔn tập: phân cấp nhân viên9Đa hình
Khái niệm cơ bản về đa hìnhĐa hình qua giao diệnKiểm tra kiểu lúc chạyToán tử is và asTừ khóa hiệp biếnÔn tập: Bộ xử lý thanh toánTự luyện tập: Trình biên dịch Dart online