Dart API参考中的抽象方法

Zhe*_*hen 5 dart

completeCompleter中的许多方法都标记为"抽象",但实际上它可以在不实现的情况下直接调用.我真的很困惑.谁能帮助我?

Sha*_*uli 7

是的,这可能有点令人困惑.虽然抽象类无法实例化,但可以通过定义工厂构造函数使它们看起来是可实例化的.这是什么Completer,Future以及其他抽象类:

abstract class Completer<T> {

  factory Completer() => new _CompleterImpl<T>();

  ...
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以在factory构造函数创建的对象上调用方法.在上面的示例中,factory Completer()返回一个新_CompleterImpl对象.查看该类的(截断的)代码:

class _CompleterImpl<T> implements Completer<T> {

  final _FutureImpl<T> _futureImpl;

  _CompleterImpl() : _futureImpl = new _FutureImpl() {}

  Future<T> get future {
    return _futureImpl;
  }

  void complete(T value) {
    _futureImpl._setValue(value);
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)

你看complete(); 这是被调用的方法.