Menu
CoddyTech

多个接口

本课属于 Coddy Dart 学习旅程的“面向对象编程”单元。第 48 课,共 110 课。

与继承相比,接口的一大优势是一个类可以实现多个接口。Dart 限制你只能继承一个类,但你可以根据需要实现任意多个接口。

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');
  }
}

实现多个接口时,你必须实现每个接口中的所有方法。类必须履行它承诺支持的所有契约。

你还可以将 extends 与多个 implements 组合使用:

class Report extends Document implements Printable, Shareable {
  Report(String content) : super(content);
  
  // 仍需实现所有接口方法
  // (本例中已从 Document 继承这些方法)
}

这种灵活性让你可以设计出适用于多种角色的类。SmartPhone 可以实现 Camera、Phone 和 MusicPlayer 接口,承诺能够完成每个接口要求的所有功能,同时保留自己的独特实现。

challenge icon

挑战

简单

让我们构建一个智能设备系统,展示单个类如何实现多个接口并组合不同的功能。你将为不同的设备功能创建单独的接口类,然后构建一个具备所有这些功能的设备。

你将把代码整理到两个文件中:

  • devices.dart:在这里定义接口和实现类:
    • 创建一个 Connectable 类,其中包含一个 connect() 方法,用于打印 Connecting to network...
    • 创建一个 Chargeable 类,其中包含一个 charge() 方法,用于打印 Charging battery...
    • 创建一个 Displayable 类,其中包含一个 showScreen(String content) 方法,用于打印 Displaying: [content]
    • 创建一个实现全部三个接口的 Tablet 类:Connectable、Chargeable 和 Displayable。添加一个带有构造函数的 String brand 属性。你的实现应分别在调用 connect、charge 和 showScreen 时打印 [brand] tablet connecting to WiFi、[brand] tablet charging via USB-C 和 [brand] screen: [content]
  • main.dart:导入设备文件,并演示 Tablet 如何满足全部三个接口的约定:
    • 创建一个品牌为 'Galaxy' 的 Tablet
    • 调用 connect()
    • 调用 charge()
    • 调用 showScreen('Welcome Home')

你的 Tablet 类必须为全部三个接口中的每个方法提供自己的实现。这说明,实现多个接口可以让单个类承诺提供多种功能,同时让每种实现都具有设备自身的特点。

预期输出:

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

亲手试试

import 'devices.dart';

void main() {
  // TODO:创建一个品牌为 'Galaxy' 的 Tablet 对象
  
  // TODO:调用 connect()
  
  // TODO:调用 charge()
  
  // TODO:调用 showScreen('Welcome Home')
  
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: Dart 在线编译器