5

completeクラス内のような多くのメソッドCompleterは「抽象」とマークされていますが、実際には実装せずに直接呼び出すことができます。私は本当に混乱しています。誰か助けてもらえますか?

4

1 に答える 1

7

はい、これは少し混乱する可能性があります。抽象クラスはインスタンス化できませんが、ファクトリコンストラクターを定義することでインスタンス化可能に見えるようにすることができます。これはCompleterFutureおよび他の抽象クラスが行うことです。

abstract class Completer<T> {

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

  ...
}

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

そして、あなたは見るcomplete(); それが呼び出されるメソッドです。

于 2012-12-01T16:39:26.993 に答える