类修饰符
本文中重点讨论如下类的修饰符及它们的组合:
abstract
interface
base
每个类(class
)都隐式地定义了一个接口(interface
),因而可以实现(implements
)一个类(即实现类中的方法)。base
类却是为继承而生,在定义它的文件之外,只能被继承,而不能被实现。
ex412.dart
:
// ex412.dart
base class Vehicle { // 1
void moveForward(int meters) {
// ...
}
}
base class Car implements Vehicle { // 2
@override
void moveForward(int meters) {
// ...
}
}
base class Motorcycle extends Vehicle { // 3
}
ex412a.dart
:
// ex412a.dart
import 'ex412.dart';
base class Truck extends Vehicle { // 4
int passengers = 4;
@override
void moveForward(int meters) {
// ...
}
}
// ERROR:
// The class 'Vehicle' can't be implemented outside of its library
// because it's a base class.
base class Train implements Vehicle { // 5
@override
void moveForward(int meters) {
// ...
}
}
ex412.dart
文件中的Vehicle
是一个base
类,它有一个实例方法moveForward(int)
;- 同一文件中的
Car
实现了Vehicle
; - 同一文件中的
Motorcycle
继承(extends
)了Vehicle
; - 另一文件(
ex412a.dart
)中的Truck
继承了Vehicle
; ex412a.dart
中的Train
实现Vehicle
,引发编译错误。
base
类有如下特点:
base
类的子类/实现类必须使用base
或final
或sealed
修饰,这是为了确保base
的语义;base
类的子类自动继承了其可见的成员(字段/方法),因此为base
类添加新的成员不会破坏子类,除非新成员与子类发生冲突;- 实例化
base
类的子类,必然导致base
类的构造函数被调用。