2010-01-11 22 views
8

Tengo un problema desagradable. Tengo dos variables de cadena (nombre de clase y métodoestático) almacenar el nombre de una clase y es método estático tengo que llamar:AS3: llamar a un método de clase estática - los nombres de clase y método son cadenas

package { 
import flash.display.Sprite; 
import flash.utils.getDefinitionByName; 
import flash.utils.getQualifiedClassName; 

public class ClassPlay extends Sprite { 

    public function ClassPlay() { 
    new Foo(); 
    var className:String = 'Foo'; 
    var staticMethod:String = 'bar'; 
    var classClass:Class = getDefinitionByName(className) as Class; 
    try { 
    classClass[staticMethod](); 
    } catch (e:Error) {} 
    } 
} 
} 

Ésta es la clase de objeto:

package { 
public class Foo { 
    public static function bar():void {trace('Foo.bar() was called.');} 
} 
} 

Funciona a la perfección. El problema al comentar la línea (9º):

// new Foo(); 

Sin esta línea que sale con una excepción:

ReferenceError: Error #1065: Variable Foo is not defined. 

¿Cómo podría hacer esto sin que la creación de instancias? Si eso es imposible, ¿hay alguna forma de instanciar la clase a partir de la variable de cadena? O si todavía es una mala práctica, ¿cómo harías eso? (Tengo que trabajar con esas dos variables de cadena desconocidas.)

Gracias de antemano.

Respuesta

8

La razón es que el compilador eliminará las clases innecesarias; si no tiene una referencia explícita a la clase Foo, no estará presente en su aplicación final.

Puede hacer la referencia en cualquier otro lugar y aún forzarlo a cargarse, por ejemplo, una matriz estática de referencias a las clases.

+2

Esto también es un problema común al usar la inyección de dependencia en as3. Para otras opciones, consulte http://www.springactionscript.org/docs/reference/html/Class-inclusion.html (nota: el sitio está caído ahora, pero debería volver al final). –

+0

Muchas gracias por el enlace;) El sitio está arriba nuevamente. – itarato

0

Debería funcionar si solo echas un rastro (classClass) - eso debería darte la referencia que necesitas, si recuerdo esto correctamente.

+0

No creo que deba llegar tan lejos. Creo que si pones el nombre de clase en tu código (que no sea un extracto de importación) se incluirá. El compilador es bastante tonto. por ejemplo: Sprite; MyClass; –

+0

No, no está funcionando. Se produjo un error cuando classClass se estaba inicializando. – itarato

Cuestiones relacionadas