2010-03-25 12 views
9

Mit diesem CodeAS3 - Kann ich wissen, ob eine Klasse eine Schnittstelle implementiert (oder eine Unterklasse einer anderen Klasse ist)?

function someFunction(classParam:Class):Boolean 
{ 
    // how to know if classParam implements some interface? 
} 

heißt classParam mit IEventDispatcher Schnittstelle Vergleich:

someFunction(EventDispatcher) // returns true 
someFunction(Object) // returns false 

Ich weiß es nicht mit is Operator erfolgen. Aber, gibt es einen Weg, es zu tun? Gibt es eine Möglichkeit zu wissen, ob eine Klasse eine Schnittstelle implementiert? (Oder ist eine Unterklasse einer anderen Klasse?)

Mögliche Lösungen:

A. ein Objekt von classParam Erstellen und Verwenden dieses Objekt is Operator zu vergleichen mit.

function someFunction(classParam:Class):Boolean 
{ 
    return (new classParam()) is IEventDispatcher 
} 

B. Verwenden describeType()

function someFunction(classParam:Class):Boolean 
{ 
    var xml:XML = describeType(classParam) 
    // found "implementsInterface" value in xml and compare to IEventDispatcher 
} 

es einen Weg gibt, die NICHT describeType verwendet oder erstellt einen new Operator?

Antwort

6

Ich sehe keinen Weg zu erreichen, was Sie versuchen, mithilfe von describeType zu tun, außer.
Es wurde für diesen Zweck erstellt, warum willst du es nicht verwenden?

Edit:
Es eigentlich nur 2 Zeilen nimmt dies zu tun:

var classDescription:XML = describeType(classParam); 
return (classDescription.factory.implementsInterface.(@type == getQualifiedClassName(IEventDispatcher)).length() != 0); 

... oder einfach nur in einem, wenn es ist, was Sie stört:

return (describeType(classParam).factory.implementsInterface.(@type == getQualifiedClassName(IEventDispatcher)).length() != 0); 
+0

Was mich stört ist die Geschwindigkeit von 'describeType'. Ist es nicht langsam? –

+0

Es hängt davon ab, wie viel Sie es verwenden, aber ja, es ist ziemlich langsam. Problem ist, ich glaube nicht, dass es einen anderen Weg gibt, dies zu erreichen. Dieser Artikel könnte Sie interessieren, der Autor hat einen Benchmark erstellt und herausgefunden, dass ein describeType auf UIComponent 5ms auf seinem Computer benötigt: http://faindu.wordpress.com/2010/02/01/actionscript-flex-dependency-injection-performance/ –

+0

Das Erstellen des Objekts dauert also weniger Zeit? Ich werde eine Benchmark dazu machen, um es zu sehen. –

0

Hinzufügen zu ‚Zed -K Antwort. Ich brauchte nicht den .factory Teil. Hier ist ein Beispiel für einen Test, der überprüft, ob die Klasse verwendet wird und eine Schnittstelle hat. "_instance" ist die getestete Klasse.

[Test] 
public function testInstanceShouldBeIUser():void 
{ 
    var classDescription:XML = describeType(_instance); 
    var type:String = getQualifiedClassName(IUser); 
    var xmlList:XMLList = classDescription.implementsInterface.(@type == type); 
    assertTrue("expected IUser", xmlList.length() != 0); 
} 
0

Wahrscheinlich nicht. Übrigens gibt es auch describeTypeJSON, was ungefähr 5x schneller als describeType ist.

Verwandte Themen