2013-09-02 15 views
6

CustomEventクラスを拡張する最良の方法はどれですか?私は以下のことを試み、スーパーコンストラクタの問題に遭遇しました:1つのファクトリコンストラクタを持つクラスを拡張する

class MyExtendedEvent extends CustomEvent { 
    int count; 

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

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

私はそれを働かせることはできません。私は私がやっているかわからないんだけど

'resolved implicit call to super constructor 'CustomEvent()''.

:私は内部コンストラクタをchaningしようとした場合

unresolved implicit call to super constructor 'CustomEvent()'

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

私はで終わる私はいつもに実行します間違っていますが、問題は、CustomEventには、工場のコンストラクタであるコンストラクタが1つしかないことです(doc-http://api.dartlang.org/docs/releases/latest/dart_html/CustomEvent.htmlというように)

CustomEvent、またはこのフォームの任意のクラスを拡張する最も良い方法は何ですか?

+0

CustomEventを拡張することはまったくできないようです。内部エラー: '[ファイル名]':エラー:行3のpos 7:クラス 'MyEvent'がネイティブフィールドクラスを拡張しようとしていますが、ライブラリ '[同じファイル名]にはネイティブリゾルバがありません。この問題を回避できるかどうかは分かりません。ごめんなさい – MarioP

答えて

10

は、工場のコンストラクタを持つクラスを直接継承することはできません。ただし、は、クラスを実装し、拡張をシミュレートするために委任を使用できます。例えば

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

NB:私は、コードスニペットを簡単にするためにここにリフレクションを使用していました。残念なことに、クラスがファクトリコンストラクタしか持たない場合は、クラスを拡張することはできません。実装することはできますが、パフォーマンスを向上させるためには、すべてのメソッドを定義することが推奨されています(method1 => _delegate.method1()

+0

これはパフォーマンスにどのような影響がありますか?反射は高価な操作であると思います。 –

+3

ここでは、より良い実装は 'method1 => _delegate.method1()'のようなすべてのメソッドを定義することでした。 –

2

)それはCustomEventでもうまくいきませんが、それはDOM型なので、これも工場のコンストラクタしかないからです。ブラウザはこれらのインスタンスを生成しなければならず、Dartオブジェクトは単なるラッパーです。 CustomElementを実装して起動しようとすると、おそらくエラーが発生します。

関連する問題