2010-03-25 19 views
9

Con este códigoAS3 - ¿Puedo saber si una clase implementa una interfaz (o es una subclase de otra clase)?

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

decir Comparando con classParamIEventDispatcher interfaz:

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

Sé que no se puede hacer con is operador. Pero, ¿hay alguna manera de hacerlo? ¿Hay alguna manera de saber si una clase implementa alguna interfaz? (O es una subclase de otra clase?)

soluciones posibles:

A. Creación de un objeto de classParam y el uso de ese objeto de comparar el uso de is operador.

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

B. Usando describeType()

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

Hay una manera que no utiliza describeType o crea un operador de new?

Respuesta

6

no veo ninguna manera de lograr lo que estás tratando de hacer, excepto mediante el uso de describeType.
Se ha creado para este propósito, ¿por qué no lo quieren usar?

Editar:
En realidad, sólo se tarda 2 líneas para hacer esto:

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

... o simplemente en uno, si es lo que le molesta:

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

Lo que me molesta es la velocidad del 'describeType'. ¿No es lento? –

+0

Depende de cuánto lo esté usando, pero sí, es bastante lento. El problema es que no creo que haya otra forma de lograr esto. En este artículo te podría interesar, el autor hizo un punto de referencia y descubrió que un describeType en UIComponent toma 5ms en su ordenador: http://faindu.wordpress.com/2010/02/01/actionscript-flex-dependency-injection-performance/ –

+0

¿Entonces crear el objeto tomará menos tiempo? Voy a ejecutar un punto de referencia sobre eso para verlo. –

0

Agregando a 'Zed -K 'respuesta. Terminé sin necesitar la parte .factory. Aquí hay un ejemplo de una prueba que verifica que la clase está utilizando y la interfaz. '_instance' es la clase bajo prueba.

[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

Probablemente no. Por cierto, también hay describeTypeJSON, bruja es aproximadamente 5 veces más rápido que describeType.

Cuestiones relacionadas