Menu
CoddyTech

Chú thích @override

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

Chú thích @override là dấu hiệu cho biết bạn cố ý thay thế một phương thức của lớp cha. Đây là một thông lệ tốt để Dart và các nhà phát triển khác nhận biết điều đó. Dù việc ghi đè phương thức vẫn hoạt động khi không có chú thích này, dùng @override sẽ giúp tăng độ an toàn.

class Animal {
  String name;
  
  Animal(this.name);
  
  void speak() {
    print('$name makes a sound');
  }
}

class Dog extends Animal {
  Dog(String name) : super(name);
  
  @override
  void speak() {
    print('$name barks: Woof!');
  }
}

Chú thích này mang lại hai lợi ích chính. Thứ nhất, nó ghi lại rõ ràng ý định của bạn: bất kỳ ai đọc code đều biết ngay phương thức này tồn tại trong lớp cha. Thứ hai, trình phân tích của Dart sẽ cảnh báo nếu phương thức ở lớp cha thực sự không tồn tại, giúp phát hiện sớm lỗi chính tả và sai sót khi tái cấu trúc.

Hãy xem điều gì xảy ra nếu bạn viết sai tên phương thức mà không có @override:

class Cat extends Animal {
  Cat(String name) : super(name);
  
  void speek() {  // Lỗi gõ nhầm! Không có cảnh báo nếu thiếu @override
    print('$name meows');
  }
}

Nếu không có chú thích, Dart sẽ cho rằng bạn đang tạo một phương thức mới tên là speek(). Khi có @override, trình phân tích sẽ báo ngay rằng lớp cha không có phương thức nào như vậy. Chú thích đơn giản này giúp ngăn những lỗi khó phát hiện về sau.

challenge icon

Thử thách

Dễ

Hãy xây dựng một hệ thống trình phát nội dung đa phương tiện để minh họa tầm quan trọng của chú thích @override khi tùy chỉnh hành vi được kế thừa. Bạn sẽ tạo các loại nội dung đa phương tiện khác nhau, mỗi loại phát nội dung theo cách riêng.

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

  • media.dart: Định nghĩa hệ thống phân cấp nội dung đa phương tiện tại đây:
    • Một lớp (class) Media có thuộc tính (property) String title, hàm khởi tạo (constructor) nhận tiêu đề và phương thức (method) play() in ra Playing: [title]
    • Một lớp Song kế thừa (inheritance) từ Media và bổ sung thuộc tính String artist. Dùng chú thích @override và ghi đè play() để in ra Playing song: [title] by [artist]
    • Một lớp Video kế thừa từ Media và bổ sung thuộc tính int duration (tính bằng giây). Dùng @override và ghi đè play() để gọi phiên bản của lớp cha bằng super.play() trước, sau đó in ra Duration: [duration] seconds
  • main.dart: Nhập tệp nội dung đa phương tiện và minh họa các phương thức đã ghi đè:
    • Tạo một đối tượng Media có tiêu đề 'Generic Content' và gọi play()
    • In một dòng trống
    • Tạo một Song có tiêu đề 'Imagine' và nghệ sĩ 'John Lennon', rồi gọi play()
    • In một dòng trống
    • Tạo một Video có tiêu đề 'Dart Tutorial' và thời lượng 360, rồi gọi play()

Chú thích @override ghi lại ý định của bạn và giúp phát hiện lỗi. Nếu vô tình viết sai play() thành plya(), chú thích sẽ cảnh báo rằng lớp cha không có phương thức như vậy.

Đầu ra dự kiến:

Playing: Generic Content

Playing song: Imagine by John Lennon

Playing: Dart Tutorial
Duration: 360 seconds

Tự làm thử

import 'media.dart';

void main() {
  // TODO: Tạo một đối tượng Media có tiêu đề 'Generic Content' rồi gọi play()
  
  
  // TODO: In ra một dòng trống
  
  
  // TODO: Tạo một Song có tiêu đề 'Imagine' và nghệ sĩ 'John Lennon', rồi gọi play()
  
  
  // TODO: In ra một dòng trống
  
  
  // TODO: Tạo một Video có tiêu đề 'Dart Tutorial' và thời lượng 360, rồi gọi play()
  
}
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