Menu
CoddyTech

Từ khóa hiệp biến

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

Khi ghi đè một phương thức trong lớp con, Dart thường yêu cầu kiểu tham số phải khớp chính xác. Nhưng đôi khi bạn muốn phương thức của lớp con chấp nhận một kiểu cụ thể hơn kiểu của lớp cha. Từ khóa covariant cho phép điều này.

Hãy xem xét tình huống trong đó lớp Animal có một phương thức nhận một Animal khác:

class Animal {
  void chase(Animal other) {
    print('Chasing an animal');
  }
}

class Dog extends Animal {
  @override
  void chase(covariant Dog other) {
    print('Dog chasing another dog');
  }
}

Nếu không có covariant, Dart sẽ báo lỗi vì Dog không cùng kiểu với Animal. Khi thêm covariant trước tham số, bạn cho Dart biết: "Mình biết kiểu này cụ thể hơn và sẽ bảo đảm chỉ truyền đúng kiểu."

Điều này hữu ích khi về mặt logic, các lớp con chỉ nên hoạt động với các đối tượng cùng loại:

void main() {
  Dog dog1 = Dog();
  Dog dog2 = Dog();
  
  dog1.chase(dog2);  // Hoạt động: Dog đuổi theo một con chó khác
}

Tuy nhiên, hãy cẩn thận: dùng covariant sẽ chuyển việc kiểm tra kiểu dữ liệu an toàn sang thời điểm chạy. Nếu bạn gọi phương thức thông qua một tham chiếu đến lớp cha với kiểu không đúng, bạn sẽ gặp lỗi khi chạy thay vì lỗi lúc biên dịch. Hãy dùng cách này khi bạn chắc chắn về các kiểu được truyền vào.

challenge icon

Thử thách

Dễ

Hãy xây dựng một hệ thống tương thích giữa các thú cưng, dùng từ khóa covariant để đảm bảo mỗi thú cưng chỉ có thể chơi với đồng loại. Bạn sẽ tạo một hệ thống phân cấp các thú cưng, trong đó mỗi loại có một phương thức (method) playWith chỉ nhận thú cưng cùng loại.

Bạn sẽ sắp xếp code vào hai tệp:

  • pets.dart: Định nghĩa hệ thống phân cấp thú cưng tại đây:
    • Một lớp Pet có thuộc tính String name và một hàm khởi tạo. Thêm phương thức playWith(Pet other) để in ra [name] plays with [other.name]
    • Một lớp Cat kế thừa Pet và ghi đè playWith, dùng từ khóa covariant để chỉ nhận một Cat. Phương thức này sẽ in ra [name] and [other.name] chase yarn together
    • Một lớp Dog kế thừa Pet và ghi đè playWith, dùng từ khóa covariant để chỉ nhận một Dog. Phương thức này sẽ in ra [name] and [other.name] fetch the ball together
    • Một lớp Rabbit kế thừa Pet và ghi đè playWith, dùng từ khóa covariant để chỉ nhận một Rabbit. Phương thức này sẽ in ra [name] and [other.name] hop around together
  • main.dart: Nhập tệp thú cưng và minh họa cách mỗi loại thú cưng chỉ chơi với đồng loại:
    • Tạo hai đối tượng Cat có tên 'Whiskers' và 'Mittens', sau đó cho Whiskers chơi với Mittens
    • Tạo hai đối tượng Dog có tên 'Buddy' và 'Max', sau đó cho Buddy chơi với Max
    • Tạo hai đối tượng Rabbit có tên 'Flopsy' và 'Cotton', sau đó cho Flopsy chơi với Cotton

Từ khóa covariant cho phép mỗi lớp con thu hẹp kiểu tham số từ Pet thành kiểu cụ thể của lớp đó, đảm bảo các thú cưng cùng loại tương tác với nhau an toàn về kiểu dữ liệu.

Đầu ra dự kiến:

Whiskers and Mittens chase yarn together
Buddy and Max fetch the ball together
Flopsy and Cotton hop around together

Tự làm thử

import 'pets.dart';

void main() {
  // TODO: Tạo hai đối tượng Cat tên là 'Whiskers' và 'Mittens'
  // Sau đó, cho Whiskers chơi với Mittens
  
  
  // TODO: Tạo hai đối tượng Dog tên là 'Buddy' và 'Max'
  // Sau đó, cho Buddy chơi với Max
  
  
  // TODO: Tạo hai đối tượng Rabbit tên là 'Flopsy' và 'Cotton'
  // Sau đó, cho Flopsy chơi với Cotton
  
}
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