Casting en Flash
Ahora que en ActionScript 2.0 tenemos un lenguaje mas estricto que se encarga de buscar fallas en nuestro código (como por ejemplo problemas al asignar un tipo de variable que no coincide con el tipo esperado) no vemos obligados a utilizar casting en algunas ocasiones. Para los que no saben de que se trata esto del casting ( ni idea de su correlativo en español ), casting es la conversión explícita de un tipo de dato a otro.
Pero el casting en flash no se comporta siempre igual, por eso realicé unas pruebas para las cuales he creado una clase ( Container ) que puede guardar cualquier tipo de data. El Container lo único que sabe es que tiene un Objeto, pero no sabe de que tipo de Objeto es, ademas posee un método getItem() que es el encargado de retornar dicho objeto.
Lo primero que probaremos es tratar de asignar el Objeto que devuelve getItem a una varible de tipo Array, ya que es un Array lo que le pasamos a nuestro container en su constructor.
var c:Container = new Container(new Array());<br />var i:Array = c.getItem(); <br />
Pero al realizar esta operación el compilador salta con un error:
Type mismatch in assignment statement: found Object where Array is required. var i:Array = c.getItem();
Esto es por que él cree que nuestro Array no es un Array sino un Objeto debido a que eso es lo que nuestra clase Container dice que devuelve.Para solucionar esto es que podemos implementar el Casting de dos maneras diferentes, como en el siguiente ejemplo:
1- var i:Array = Array(c.getItem());<br />2- var i:Array = (Array)(c.getItem());
De estas dos maneras logramos que el compilador este contento y que nos asigne nuestro Array obtenido a nuestra variable. Pero no siempre esto funciona debido a que si en vez de querer asignar un data definida dentro del player (como Array , String, Math) queremos asignar un tipo creado por una clase especifíca nuestra, los resultados no son siempre iguales.
Para mostrar esto creé dos clases mas (Item y TestCasting) y traté de asignar lo retornado por getItem, que es un tipo Item, a nuestra variable, como aparece a continuación:
1- var i:Array = Array(c.getItem());<br />2- var i:Array = (Array)(c.getItem());
El problema aquí es que el primer ejemplo corre sin ningún problema pero en el segundo lo que se le asigna a nuestra variable es el valor de undefined en vez del de Item. Por eso es conveniente acostumbrarse a realizar el casting de la primer forma.
He puesto todas las clases incluida la .fla en un.zip así pueden bajarla y correrla más fácil.