Menu
CoddyTech

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 độ.

challenge icon

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ên TaskCategory để đạ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 isUrgent trả về true nế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])
    Enum của bạn cũng cần triển khai 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).
  • 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ó isUrgent là true

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 Fix

Tự 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
}
quiz iconTự kiểm tra

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

Tự luyện tập: Trình biên dịch Dart online