17

CustomEventクラス、つまりファクトリ コンストラクターが 1 つしかないクラスを拡張する最良の方法はどれだろうと考えていました。私は次のことを試してみましたが、スーパーコンストラクターで問題が発生しました:

class MyExtendedEvent extends CustomEvent {
  int count;

  factory MyExtendedEvent(num count) {
    return new MyExtendedEvent._internal(1);
  }

  MyExtendedEvent._internal(num count) {
    this.count = count;
  }
}

しかし、私はそれを機能させることができません。私はいつも遭遇します:

スーパー コンストラクター 'CustomEvent()' への未解決の暗黙的な呼び出し

内部コンストラクターを次のように変更しようとすると:

MyExtendedEvent._internal(num count) : super('MyCustomEvent') {
  this.count = count;
}

私はで終わる:

'スーパー コンストラクター 'CustomEvent()'' への暗黙的な呼び出しを解決しました。

何が間違っているのかわかりませんが、問題はCustomEvent、ファクトリ コンストラクターであるコンストラクターが 1 つしかないことだと思います (doc が言うように - http://api.dartlang.org/docs/releases/latest/ dart_html/CustomEvent.html )

CustomEvent、またはこの形式のクラスを拡張する最良の方法は何ですか?

4

4 に答える 4

20

ファクトリ コンストラクターを使用してクラスを直接拡張することはできません。ただし、クラスを実装し、委譲を使用して拡張機能をシミュレートすることはできます。

例えば ​​:

class MyExtendedEvent implements CustomEvent {
  int count;
  final CustomEvent _delegate;

  MyExtendedEvent(this.count, String type) :
    _delegate = new CustomEvent(type);

  noSuchMethod(Invocation invocation) =>
      reflect(_delegate).delegate(invocation);
}

注意: ここではリフレクションを使用して、コード スニペットを簡略化しました。(パフォーマンスに関して)より良い実装は、次のようなすべてのメソッドを定義することでしたmethod1 => _delegate.method1()

于 2013-09-02T08:49:53.290 に答える
2

残念ながら、ファクトリ コンストラクターしかないクラスは拡張できず、実装することしかできません。ただし、CustomEvent は DOM タイプであるため、これはうまく機能しません。これがファクトリ コンストラクターしかない理由でもあります。ブラウザーはこれらのインスタンスを生成する必要があり、Dart オブジェクトは単なるラッパーです。CustomElement を実装して起動しようとすると、おそらくエラーが発生します。

于 2013-09-02T18:04:36.957 に答える