多个接口
本课属于 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 接口,承诺能够完成每个接口要求的所有功能,同时保留自己的独特实现。
挑战
简单让我们构建一个智能设备系统,展示单个类如何实现多个接口并组合不同的功能。你将为不同的设备功能创建单独的接口类,然后构建一个具备所有这些功能的设备。
你将把代码整理到两个文件中:
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')
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Dart 在线编译器