¿Puedo crear una instancia de una clase de AS3 simplemente sabiendo su nombre? Me refiero representación de cadena, como FlagFrance
¿Puedo crear una instancia de una clase de AS3 simplemente sabiendo su nombre?
Respuesta
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.
Sí, utilizo getDefinitionByName
:
import flash.utils.getDefinitionByName;
var FlagFranceClass:Class = getDefinitionByName("FlagFrance");
var o:* = new FlagFranceClass();
- 1. ¿Crear una instancia de clase desde su nombre?
- 2. Cuándo utilizar el puntero a una clase y cuándo simplemente crear una instancia como una variable
- 3. ¿Cómo puedo instanciar un objeto sabiendo solo su nombre?
- 4. ¿Cómo puedo crear una nueva instancia de clase de una clase dentro de una clase (estática)?
- 5. Java cómo crear una instancia de una clase de cadena
- 6. una instancia de una clase a partir de su nombre textual
- 7. Crear una instancia de una clase en su constructor estático: ¿por qué está permitido?
- 8. ¿Crees un objeto sabiendo solo el nombre de la clase?
- 9. ¿Cómo crear una instancia predeterminada después de crear una instancia con nombre?
- 10. Crear una instancia de una clase Python a partir de un nombre
- 11. Crear una instancia de una clase python en C#
- 12. cómo crear dinámicamente una instancia de una clase en python?
- 13. crear una nueva instancia de una clase sin operador "nuevo"
- 14. Cómo crear una instancia de PrivateType de clase privada interna
- 15. AS3 - ¿Puedo saber si una clase implementa una interfaz (o es una subclase de otra clase)?
- 16. Cómo crear una instancia de HttpPostedFileBase (o su tipo heredado)
- 17. ¿Crear instancia de clase objetivo-c por nombre?
- 18. Crear una instancia de una clase a partir de una cadena
- 19. VB.NET: Obtener el nombre de clase de una instancia
- 20. Obteniendo el nombre de la clase de una instancia
- 21. ¿Puedo convertir dinámicamente una instancia de una clase a otra?
- 22. una instancia de una nueva clase del nombre de una variable en un espacio de nombres
- 23. PHP: cómo crear una instancia de una clase con argumentos de otra clase
- 24. crear instancia de clase dinámica
- 25. Reflejo en Ruby. Crear una instancia de un objeto por el nombre de clase dado
- 26. Crear instancia de una clase con dependencias utilizando Autofac
- 27. ¿Puede una clase python devolver una nueva instancia de su clase?
- 28. ¿Puedo crear una nueva instancia de mi clase de objeto administrado personalizado sin pasar por NSEntityDescription?
- 29. Cómo hacer AutoMapper crear una instancia de la clase
- 30. Python: crear una instancia de clase sin invocar el inicializador
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. –
@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