Briconsejo: Array cast en AS2

5 de octubre de 2008

AS2 no permite hacer cast a un objeto Array.  Así de simple y doloroso. Esto se debe a que, por compatibilidad hacia atrás con AS1, Adobe ha mantenido que Array también sea una función contructora de matrices, y que tiene preferencia sobre los casting.

De esta manera, al hacer Array(Objeto) lo que hacemos es contruir un Array de un solo elemento, ese Objeto, el cuál bien puede ser una matriz que nos hemos traido de vete a saber donde, y a la que tenemos que hacer un casting para usarla en vete a saber qué. Pues así no se puede.

Ejemplo:

Para evitar que mi diseñador Flash estuviera todo el día usando _root para almacenar variables y objetos de uso global en la aplicación, decidí programar una pequeña caché estática, de la que pongo el esqueleto:

[code lang=”actionscript”]
class net.somms.Cache{
private static var cache:Object;
public static function Get (Key:String):Object;
public static function Set (Key:String, Value:Object):Object
}
[/code]

Acostumbro a poner siempre el tipo que devuelve una función aunque sea un Object, como en el método Get, por claridad y porque me parece que me ha ido siempre muy bien en otros leguajes como C#.

Esto funciona bien. Cuando te traes un objeto de la caché siempre tienes que hacer un casting al tipo de objeto, dejando claras cuales son tus intenciones y evitando errores:

[code lang=”actionscript”]
var test:Number = 2123;
Cache.Set(‘Test’,test);
var test2:Number = Number(Cache.Get(‘Test’));
[/code]

El problema surge cuando vas a traer un Array de la caché y haces el cast, ya que, como hemos visto al principio,  no se puede.

La solución es utilizar (ojo, que esto duele) la sintaxis de creación de clases dinámicas con {}, y asignar nuestro objeto de la siguiente manera:

[code lang=”actionscript”]
var test2:Array = {arr:test}.arr;
[/code]

Con las clases dinámicas, AS2 no utiliza verificación del tipo, así que podemos hacerlo alegremente.

Otra posibilidad es no poner el tipo devuelto al método Get, cosa que se puede hacer por la misma compatibilidad hacia atrás con AS1, y que no me parece correcta ya que hace que el código quede sin definir.

  • qrcode link