Tipos Enumerados en AS3(II)

12 de diciembre de 2008

Siguiendo con el artículo Tipos Enumerados en AS3, vamos a dar una solución correcta al problema de la herencia desde nuestra nueva clase Enum.

Como vimos, es necesario bloquear la creación de las clases mediante un bloque estático después de que se definan las constantes de nuestro enumerado. Dado que el bloqueo se realiza desde el constructor de Enum hay que utilizar un sistema que nos permita bloquear selectivamente las clases hijas según su tipo. Para esto podemos utilizar una lista, en la que iremos agregando los tipos de clases bloqueadas, y en el constructor de Enum verificamos su existencia. Así Enum tendría el siguiente código:

[code lang=”actionscript”]
package net.somms.utils
{
import de.polygonal.ds.Set;

import flash.utils.getQualifiedClassName;

public class Enum
{
protected var value:String;
static private var lockList:Set=new Set();
/**
* Bloquea la instanciacion de clases
* @param target Nombre “cualificado” de la clase: namespace::clase
*/
protected static function lock(target:String):void
{

if(!lockList.contains(target))
{
lockList.set(target);
}
else
{
throw new Error(“El objeto ” + target + ” ya ha sido bloquedao”);
}

}
/**
* Verifica si una clase esta bloqueada
* @param target Nombre “cualificado” de la clase: namespace::clase
* @return Si esta o no bloqueado.
*
*/
private static function isLocked(target:String):Boolean
{
return lockList.contains(target);
}

public function Enum(Value:String)
{
if(!isLocked(getQualifiedClassName(this)))
{
this.value = Value;
}
else
{
throw new Error(“No se pueden crear instancias de ” + getQualifiedClassName(this));
}
}

public function toString():String
{

return value;
}

}
}
[/code]

El método lock será llamado desde las clases hijas para bloquear la construcción de una clase. Lo que hace es agregar el nombre de la clase a lockList. Después en el constructor de Enum se llama a isLocked, y en caso de que sea afirmativo lanza un error en tiempo de ejecución.

En las clases que hereden habrá que incluir el bloque de código estático que llama al bloqueo. Por ejemplo:

[code lang=”actionscript”]
package net.somms.i8n
{
import flash.utils.getQualifiedClassName;

import net.somms.utils.Enum;

public final class IdiomEnum extends Enum
{
public static const English:IdiomEnum = new IdiomEnum(“EN”);
public static const Spanish:IdiomEnum = new IdiomEnum(“”);
{
lock(“net.somms.utils::IdiomEnum”);
//trace(“Codigo esttico de IdiomEnum ” + lock);
}
public function IdiomEnum(Name:String)
{
//trace(“Constructor de IdiomEnum”);
super(Name);

}

}
}
[/code]

Como se vé, hacemos una llamada a lock pasando como parámetro el nombre “cualificado” de la clase. De esta manera la clase no se podrá crear más.

  • qrcode link