Cuando desarrollé mi primer gran proyecto en Actionscript 2.0 con clases, la mayor parte de ellas contenían atributos estáticos "referencia" , o pasaba referencias como propiedad. Parecía que todo en flash perdía la referencia: enchufaba funciones a los onLoad de los parsers, y perdía la referencia, en los onClick de los botones perdía la referencia, los setInterval, venga a pasar referencias... parecía todos los eventos se habían aliado contra mí, :( y eso que ya tenía callo con problemas de referencias.

Incluso sugerí en algún foro la idea de hacer un FAQ de referencias por ser un problema muy común entre gente interesada por aprender Actionscript.

Pero con Flash 7.2, apareció la clase Delegate.

Éste es un ejemplo de mis frustraciones: un típico parser que simplemente visualiza un XML en un TextField en el que las referencias son todo problemas.

Actionscript:
  1.  
  2. /**
  3. * @author Alejanadro Sánchez Marcos
  4. * @usage tutorial de uso de delegate en los parsers.
  5. * la clase emula un parser básico y su uso común.
  6. */
  7. class ParserTradicional {
  8.         public var xml:XML;
  9.         public var textoResultado:TextField;
  10.         // ouch!
  11.         public static var ruta:ParserTradicional;
  12.         public function ParserTradicional(URL:String, textoResultado:TextField) {
  13.                 xml = new XML();
  14.                 // off!
  15.                 ruta = this;
  16.                 this.textoResultado = textoResultado;
  17.                 xml.load(URL);
  18.                 // empiezan los problemas...
  19.                 // xml.ruta = this; // ay!           
  20.                 xml.onLoad = parse;
  21.         }
  22.         public function parse() {
  23.                 // no tengo ruta.. mmm meto un atributo estático con la ruta
  24.                 // buff!
  25.                 trace(ruta.xml);
  26.                 ruta.mostrarXML();
  27.         }
  28.         public function mostrarXML() {
  29.                 textoResultado.text = xml.toString();
  30.         }
  31. }
  32.  
  33.  
  34.  

y ésta es exactamente la misma clase, pero usando delegate.

Actionscript:
  1.  
  2. import mx.utils.Delegate;
  3. /**
  4. * @author Alejanadro S�nchez Marcos
  5. * @usage tutorial de uso de delegate en los parsers.
  6. * la clase emula un parser básico y su uso común.
  7. */
  8. class ParserDelegate {
  9.         public var xml:XML;
  10.         public var textoResultado:TextField;
  11.         public function ParserDelegate(URL:String, textoResultado:TextField) {
  12.                 this.textoResultado = textoResultado;
  13.                 xml = new XML();
  14.                 xml.load(URL);
  15.                 // yeeeha!
  16.                 xml.onLoad = Delegate.create(this, parse);
  17.         }
  18.         public function parse(success:Boolean) {
  19.                 if (success) {
  20.                         mostrarXML();
  21.                 }
  22.         }
  23.         public function mostrarXML() {
  24.                 textoResultado.text = xml.toString();
  25.         }
  26. }
  27.  
  28.  

[ enlaces relacionados: eventos y delegate en Actionscript 3.0 ]