2011-09-29 12 views

Respuesta

24

crear instancias de clases dinámicamente por su nombre. Para ello siguiente código se puede utilizar:

//cc() is called upon creationComplete 
    private var forCompiler:FlagFrance; //REQUIRED! (but otherwise not used) 

    private function cc():void 
    { 
     var obj:Object = createInstance("flash.display.Sprite"); 
    } 

    public function createInstance(className:String):Object 
    { 
     var myClass:Class = getDefinitionByName(className) as Class; 
     var instance:Object = new myClass(); 
     return instance; 
    } 

la documentación para getDefinitionByName dicen:

"Returns a reference to the class object of the class specified by the name parameter." 

El código anterior que necesitaba para especificar el valor de retorno como una clase? Esto se debe a que getDefinitionByName también puede devolver una función (por ejemplo, flash.utils.getTimer - una función de nivel de paquete que no se encuentra en ninguna clase). Como el tipo de devolución puede ser una Función o una Clase, el equipo de Flex especificó el tipo de devolución como Objeto y se espera que realice un lanzamiento según sea necesario.

El código anterior imita fielmente el ejemplo dado en los documentos, pero de alguna manera es un mal ejemplo porque todo va a funcionar bien para flash.display.Sprite, pero intenta hacer lo mismo con una clase personalizada y probablemente termines con el siguiente error:

ReferenceError: Error #1065: Variable [name of your class] is not defined. 

el motivo del error es que debe tener una referencia a su clase en el código - por ejemplo, es necesario crear una variable y especificar su tipo, así:

private var forCompiler:SomeClass; 

Sin hacer esto tu clase no será compilado en el .swf en tiempo de compilación. El compilador solo incluye las clases que realmente se usan (y no solo las importadas). Lo hace para optimizar el tamaño del .swf. Por lo tanto, la necesidad de declarar una variable no debería considerarse un descuido o un error, aunque sí se siente hackear declarar una variable que no utilizas directamente.

+0

Probablemente sería conveniente almacenar en caché el resultado de la llamada getDefinitionByName. No sé qué tan lento es, pero dado que implica reflexión, probablemente no sea muy rápido. –

+0

@Laurent Sí, si necesita acceder a una clase de esta manera varias veces, almacene el valor de retorno en su propia var. Pero hacer un caché general para llamadas getDifinitionByName puede no ser tan inteligente. ¡Las veces que he usado solo lo llamé una vez! Por lo tanto, tener un resultado almacenado en caché solo ocuparía la memoria. – RasmusWL

7

Sí, utilizo getDefinitionByName:

import flash.utils.getDefinitionByName; 

var FlagFranceClass:Class = getDefinitionByName("FlagFrance"); 
var o:* = new FlagFranceClass(); 
Cuestiones relacionadas