9 Stimmen

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

Mit diesem Code

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

d.h. Vergleich von classParam avec IEventDispatcher Schnittstelle:

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

Ich weiß, dass es nicht möglich ist, mit is Betreiber. Aber gibt es eine Möglichkeit, dies zu tun? Gibt es eine Möglichkeit zu wissen, ob eine Klasse eine Schnittstelle implementiert (oder eine Unterklasse einer anderen Klasse ist)?

Mögliche Lösungen:

A. Erstellen eines Objekts von classParam und die Verwendung dieses Objekts zum Vergleich mit is Betreiber.

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

B. Verwendung von describeType()

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

Es gibt einen Weg, der KEINE VERWENDUNG describeType oder erstellt eine new Betreiber?

6voto

Zed-K Punkte 962

Ich sehe keine Möglichkeit, das zu erreichen, was Sie versuchen, außer durch die Verwendung von describeType .
Sie wurde zu diesem Zweck geschaffen, warum wollen Sie sie nicht nutzen?

Bearbeiten:
Dazu sind eigentlich nur 2 Zeilen nötig:

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

...oder nur in einem, wenn Sie das stört:

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

1voto

M.A. Hanin Punkte 7876

Vielleicht können die Codebeispiele in diesem Artikel eine Antwort geben: Laufzeitprüfungen für abstrakte Klassen und Methoden in ActionScript 3.0

0voto

haysclark Punkte 1050

Ich schließe mich der Antwort von "Zed-K" an. Am Ende brauchte ich den .factory-Teil nicht. Hier ist ein Beispiel für einen Test, der überprüft, ob die Klasse eine Schnittstelle verwendet. _instance' ist die zu testende 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 );
}

0voto

Sergey Sha Punkte 91

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X