Menu
CoddyTech

Từ khóa on trong Mixin

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 53 trên 110.

Đôi khi, một mixin cần dùng phương thức hoặc thuộc tính của lớp được trộn vào. Từ khóa on cho phép bạn giới hạn mixin, chỉ dùng với các lớp kế thừa một kiểu cụ thể.

class Animal {
  String name;
  Animal(this.name);
  
  void breathe() => print('$name is breathing');
}

mixin Swimming on Animal {
  void swim() {
    print('$name is swimming');  // Có thể truy cập 'name' từ Animal
    breathe();  // Có thể gọi các phương thức (method) của Animal
  }
}

class Fish extends Animal with Swimming {
  Fish(String name) : super(name);
}

Khai báo on Animal nghĩa là mixin này chỉ có thể áp dụng cho các lớp kế thừa Animal. Nhờ đó, mixin có thể truy cập các thành viên của Animal. Nếu không có on, mixin sẽ không biết name hay breathe() có tồn tại hay không.

Nếu bạn thử dùng một mixin bị giới hạn trên một lớp không tương thích, Dart sẽ báo lỗi khi biên dịch:

class Robot with Swimming {}  // Lỗi! Robot không kế thừa Animal

Ràng buộc này hữu ích khi chức năng của mixin phụ thuộc vào những khả năng cụ thể của lớp cơ sở. Nó tạo ra một cam kết an toàn hơn: mixin đảm bảo một số hành vi nhất định, nhưng chỉ khi có nền tảng cần thiết để hoạt động chính xác.

challenge icon

Thử thách

Dễ

Hãy xây dựng một hệ thống phương tiện để minh họa cách từ khóa (keyword) on giới hạn mixin, chỉ cho phép chúng hoạt động với các lớp cơ sở cụ thể. Bạn sẽ tạo một mixin bổ sung chức năng tăng tốc turbo, nhưng chỉ những lớp kế thừa lớp cơ sở Vehicle mới có thể sử dụng mixin này.

Bạn sẽ chia code thành hai tệp:

  • vehicles.dart: Định nghĩa lớp cơ sở, mixin bị giới hạn và các loại phương tiện tại đây:
    • Lớp Vehicle có thuộc tính String model và thuộc tính int speed. Thêm hàm khởi tạo nhận cả hai giá trị. Thêm phương thức accelerate() để in ra [model] accelerating to [speed] km/h
    • Mixin TurboBoost bị giới hạn ở Vehicle bằng từ khóa on. Mixin này cần có phương thức activateTurbo() để in ra [model] TURBO ACTIVATED!, sau đó gọi accelerate() (cả hai đều có thể truy cập nhờ ràng buộc on Vehicle)
    • Lớp SportsCar kế thừa Vehicle và sử dụng mixin TurboBoost. Thêm thuộc tính String color. Hàm khởi tạo cần nhận model, speed và color. Thêm phương thức showOff() để in ra [color] [model] ready to race!
  • main.dart: Nhập tệp phương tiện và minh họa cách mixin bị giới hạn hoạt động:
    • Tạo một SportsCar có model 'Ferrari', speed 320 và color 'Red'
    • Gọi showOff()
    • Gọi activateTurbo()

Mixin TurboBoost có thể truy cập model và gọi accelerate() vì khai báo on Vehicle đảm bảo rằng mixin này chỉ được kết hợp vào các lớp kế thừa Vehicle. Điều này tạo ra một quy ước an toàn, theo đó mixin biết chính xác những khả năng nào có sẵn.

Đầu ra mong đợi:

Red Ferrari ready to race!
Ferrari TURBO ACTIVATED!
Ferrari accelerating to 320 km/h

Tự làm thử

import 'vehicles.dart';

void main() {
  // TODO: Tạo một SportsCar có model 'Ferrari', speed 320 và color 'Red'
  
  // TODO: Gọi showOff()
  
  // TODO: Gọi activateTurbo()
}
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