Crear Dinámicamente Instancias de Clase en AS3

Publicado por Iván Gajate el 7 de junio de 2009 en AS3, Flash

Normalmente creamos una instancia de una clase con un simple

var cuadrado:Cuadrado = new Cuadrado();

Y eso está muy bien cuando conocemos el tipo de objeto que queremos crear, en este caso un Cuadrado.

Pero cuando no lo conocemos porque es variable, por ejemplo porque depende de una elección del usuario, tenemos que hacerlo así:

import flash.utils.getDefinitionByName;

var nombreClase:String = "es.yporqueno.Cuadrado";
var miClase:Class = Class(getDefinitionByName(nombreClase));
var instancia:* = new miClase();

addChild(instancia);

 

No es muy diferente a lo que hacíamos antes. La primera línea (import aparte) es sólo el nombre de la clase que queremos crear, la ruta completa para ser exactos, en este caso el la clase Cuadrado (sin la extensión), que está en el paquete es.yporqueno.

Luego creamos un objeto de tipo Class donde ya tenemos una referencia real de nuestra clase, no solo su nombre entrecomillado, sino que ES la clase. Ahora tan solo tenemos que instanciarla como hacíamos antes y añadirla a la lista de visualización si fuese necesario.

Si nuestra clase Cuadrado representa un clip de la biblioteca no hay más problema, pues Flash ya ha incorporado una clase con su nombre al compilar como ya vimos.

instanciar-una-clase-dinamicamente

Pero si nuestra clase no corresponde con un clip de la biblioteca, entonces nos dará un error al compilar porque Flash no ha incorporado la clase Cuadrado en el swf (eso si que no se puede hacer dinámicamente 🙁

Para forzar a Flash a que incluya nuestras clases basta con que creemos una variable del tipo Cuadrado en nuestra clase.

Como puede que sean muchas y para que sea más limpio las podemos sacar a una clase contenedora de variables que sólo sirve para obligar a que Flash las incluya al compilar.

package {
	
	import es.yporqueno.Cuadrado;
	import es.yporqueno.Circulo;
	import es.yporqueno.Triangulo;
	import es.yporqueno.Pentagono;
	import es.yporqueno.Rectangulo;
	
	public class IncluirNombresDeClase(){
		
		private var cuadrado:Cuadrado;
		private var circulo:Circulo;
		private var triangulo:Triangulo;
		private var pentagono:Pentagono;
		private var rectangulo:Rectangulo;
		
	}
	
}

Y claro, para que Flash incluya esa clase y con ella todas las que tiene dentro, instancio en alguna parte de mi aplicación la clase IncluirNombresDeClase.

var incluir:IncluirNombresDeClase = new IncluirNombresDeClase();

Nota: En AS2, se puede hacer lo mismo así:

import com.dynamicflash.utils.ClassFinder;

var miClase:Function = ClassFinder.find("es.yporqueno.Cuadrado");
var instancia:Object = new miClase();

 

19 comentarios para “Crear Dinámicamente Instancias de Clase en AS3”

  1. Hola Manuel
    aunque esto es un blog personal y no un foro, te contesto para aclararte un poco el tema, aunque mejor busca tutoriales de Programación Orientada a Objetos (POO), hay muchos por la red, y entenderás mejor estos conceptos.
    Un objeto de programación se crea a partir de una clase (tu primer archivo .as), y ese objeto de programación, si quieres que sea un clip que puedas ver y tocar en el escenario, se lo puedes asociar a un clip de tu biblioteca (tu .fla conectado a la clase). De esa forma, cuando hagas un new Cuadrado() estarás creando una instancia de Cuadrado.as que además es un un clip de tu biblioteca.
    Por último, este new Cuadrado() lo puedes hacer donde mejor te convenga, en un fotograma en el fla, o en otro archivo .as (tu segundo archivo) independiente de todo lo anterior. Esta es la ventaja de la POO, que es muy modular y permite ir creciendo de forma mas o menos fácil.
    Espero haberte aclarado el tema, pero lo dicho, busca tutoriales más extensos sobre POO.
    Un saludo.

  2. Hola, estoy empezando con el actionscript as3 y os quisiera hacer una consulta. Me han enseñado que para crear una clase hay que hacerlo en 2 archivos con extensión .as: uno que crea la clase y otro que instancia la clase. Y que en otra carpeta aparte, se crea el archivo fla que vaya conectado a la clase creada, pero que en ese fla no se escribe nada de nada. El caso es que en todos los tutoriales que leo por la red, nadie crea dos archivos .as para crear la clase; la instancia se crea directamente en el fla. ¿Alguien sabe por que se crean dos archivos .as? ¿Es mejor, es peor, es otra forma? ¿Esto ya no se hace asi en AS3? … Gracias anticipadas