2013-09-02 10 views
6

Ich frage mich, welcher der beste Weg ist, um die CustomEvent Klasse zu erweitern, eine Klasse, die nur einen Fabrik Konstruktor hat. Ich habe versucht, das folgende zu tun und stieß auf ein Problem mit dem Super-Konstruktor:Erweitern einer Klasse mit nur einem Factory-Konstruktor

aber ich kann es nicht funktionieren. Ich laufe immer in:

unresolved implicit call to super constructor 'CustomEvent()'

Wenn ich versuche, den internen Konstruktor chaning:

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

ich am Ende mit:

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

Ich bin nicht sicher, was ich tue falsch - aber ich schätze das Problem ist, dass die CustomEvent nur einen Konstruktor hat, der ein Fabrikkonstruktor ist (wie doc sagt - http://api.dartlang.org/docs/releases/latest/dart_html/CustomEvent.html)

Was ist der beste Weg, um eine CustomEvent oder eine Klasse dieses Formulars zu erweitern?

+0

Es scheint, als ob es überhaupt nicht möglich ist, CustomEvent zu erweitern. Ich habe versucht, es auszutricksen, und endete stattdessen mit einem Laufzeitfehler: Interner Fehler: '[Dateiname]': Fehler: Zeile 3 Pos 7: Klasse 'MyEvent' versucht, eine native Feldklasse zu erweitern, aber Bibliothek '[gleicher Dateiname ] 'hat keine nativen Resolver. "Ich weiß nicht, ob man das umgehen kann oder nicht, tut mir leid. – MarioP

Antwort

10

Sie können nicht direkt erweitern eine Klasse mit einem Fabrik Konstruktor. Sie können jedoch implementieren die Klasse und Delegierung verwenden, um die Erweiterung zu simulieren.

Zum Beispiel:

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: Ich habe hier Reflexion des Code-Snippets zu vereinfachen. Eine bessere Umsetzung (in Bezug von Leistungen) Leider alle Methoden wie method1 => _delegate.method1()

+0

Wie wird sich das auf die Leistung auswirken? Ich kann mir vorstellen, dass Reflektion eine teure Operation ist. –

+3

Ich habe hier die Spiegelung vereinfacht Eine bessere Implementierung wäre es gewesen, alle Methoden wie 'method1 => _delegate.method1()' zu definieren –

2

zu definieren gewesen wäre, kann man nicht eine Klasse erweitern, wenn es nur Fabrikbauer hat, können Sie es nur umsetzen können. Das funktioniert jedoch nicht gut mit CustomEvent, da es sich um einen DOM-Typ handelt, weshalb es auch nur Factory-Konstruktoren hat: Der Browser muss diese Instanzen erzeugen, das Dart-Objekt ist nur ein Wrapper. Wenn Sie versuchen, CustomElement zu implementieren und eines auszulösen, erhalten Sie wahrscheinlich einen Fehler.

Verwandte Themen