类修饰符

本文中重点讨论如下类的修饰符及它们的组合

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) {
    // ...
  }
}
  1. ex412.dart 文件中的Vehicle是一个 base 类,它有一个实例方法 moveForward(int);
  2. 同一文件中的 Car 实现了 Vehicle;
  3. 同一文件中的 Motorcycle 继承(extends)了 Vehicle;
  4. 另一文件( ex412a.dart )中的 Truck 继承了 Vehicle;
  5. ex412a.dart 中的 Train 实现 Vehicle,引发编译错误。

base 类有如下特点:

  • base类的子类/实现类必须使用basefinalsealed修饰,这是为了确保base的语义;
  • base类的子类自动继承了其可见的成员(字段/方法),因此为base类添加新的成员不会破坏子类,除非新成员与子类发生冲突;
  • 实例化base类的子类,必然导致base类的构造函数被调用。

sealed

final

修饰符的组合

参考资料