Menu
CoddyTech

Nhiều interface

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

Một trong những ưu điểm lớn nhất của giao diện so với kế thừa là một lớp có thể triển khai nhiều giao diện. Dart chỉ cho phép bạn kế thừa một lớp, nhưng bạn có thể triển khai bao nhiêu giao diện tùy ý.

abstract class Printable {
  void printContent();
}

abstract class Saveable {
  void save();
}

abstract class Shareable {
  void share(String recipient);
}

class Document implements Printable, Saveable, Shareable {
  String content;
  
  Document(this.content);
  
  @override
  void printContent() {
    print('Printing: $content');
  }
  
  @override
  void save() {
    print('Saving document...');
  }
  
  @override
  void share(String recipient) {
    print('Sharing with $recipient');
  }
}

Khi triển khai nhiều giao diện, bạn phải cài đặt tất cả phương thức của từng giao diện. Lớp phải đáp ứng mọi cam kết mà nó hứa hỗ trợ.

Bạn cũng có thể kết hợp extends với nhiều implements:

class Report extends Document implements Printable, Shareable {
  Report(String content) : super(content);
  
  // Vẫn phải triển khai tất cả các phương thức (method) của giao diện
  // (trong trường hợp này, các phương thức đã được kế thừa từ Document)
}

Tính linh hoạt này cho phép bạn thiết kế các lớp phù hợp với nhiều vai trò. Một SmartPhone có thể triển khai các giao diện Camera, Phone và MusicPlayer, cam kết thực hiện mọi yêu cầu của từng giao diện mà vẫn giữ cách triển khai riêng.

challenge icon

Thử thách

Dễ

Hãy xây dựng một hệ thống thiết bị thông minh để minh họa cách một lớp có thể triển khai nhiều giao diện (interface) nhằm kết hợp các khả năng khác nhau. Bạn sẽ tạo các lớp giao diện riêng cho từng tính năng của thiết bị, rồi xây dựng một thiết bị có thể làm tất cả.

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

  • devices.dart: Định nghĩa các giao diện và lớp triển khai tại đây:
    • Một lớp Connectable có phương thức connect() để in ra Connecting to network...
    • Một lớp Chargeable có phương thức charge() để in ra Charging battery...
    • Một lớp Displayable có phương thức showScreen(String content) để in ra Displaying: [content]
    • Một lớp Tablet triển khai cả ba giao diện: Connectable, Chargeable và Displayable. Thêm thuộc tính String brand cùng hàm khởi tạo. Các phần triển khai của bạn cần in ra [brand] tablet connecting to WiFi khi gọi connect, [brand] tablet charging via USB-C khi gọi charge và [brand] screen: [content] khi gọi showScreen
  • main.dart: Nhập tệp thiết bị và minh họa cách Tablet đáp ứng các hợp đồng của cả ba giao diện:
    • Tạo một Tablet có thương hiệu 'Galaxy'
    • Gọi connect()
    • Gọi charge()
    • Gọi showScreen('Welcome Home')

Lớp Tablet phải tự triển khai mọi phương thức từ cả ba giao diện. Điều này cho thấy việc triển khai nhiều giao diện cho phép một lớp đảm nhiệm nhiều khả năng, đồng thời giữ cho mỗi phần triển khai phù hợp riêng với thiết bị.

Đầu ra dự kiến:

Galaxy tablet connecting to WiFi
Galaxy tablet charging via USB-C
Galaxy screen: Welcome Home

Tự làm thử

import 'devices.dart';

void main() {
  // TODO: Tạo một Tablet có thương hiệu 'Galaxy'
  
  // TODO: Gọi connect()
  
  // TODO: Gọi charge()
  
  // TODO: Gọi showScreen('Welcome Home')
  
}
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