AS3 101: Consejo rapido - envío de eventos sin extender EventDispatcher
() translation by (you can also view the original English article)
Es raro, pero sucede. A veces es absolutamente necesario extender una clase, y esa clase aún no extiende EventDispatcher
. Al mismo tiempo, es absolutamente necesario que tu clase sea un EventDispatcher
. Dado que ActionScript 3 no permite la herencia múltiple, ¿cómo concilias esto?
En otras situaciones, tal vez te gustaría crear una clase que tenga un montón de métodos estáticos y no esté realmente destinada a ser instanciada. También te gustaría poder enviar eventos desde esta clase, pero puedes extender EventDispatcher
porque eso habilita métodos de instancia, no métodos de clase.
Echemos un vistazo a cómo lograr estos objetivos.
Paso 1: cómo hacerlo
La solución en ambos casos es crear una instancia, aferrarse y usar un objeto EventDispatcher
. Es decir, un nuevo objeto EventDispatcher()
, no necesariamente ninguna de sus subclases. En el caso de necesitar extender algo más, también puedes hacer que tu clase implemente la interfaz IEventDispatcher
.
El proceso es algo como esto:
-
Implementa
IEventDispatcher
(no para la clase estática).1
package {
2
import flash.events.*;
3
public class ArrayDispatcher extends Array implements IEventDispatcher {
4
public function ArrayDispatcher() {
5
}
6
}
7
}
-
Crea un nuevo objeto
EventDispatcher
y guárdalo en una propiedad.1
private var _dispatcher:EventDispatcher
2
public function ArrayDispatcher() {
3
_dispatcher = new EventDispatcher();
4
}
-
Implementa los métodos definidos por
IEventDispatcher
, y simplemente envuelve el método coincidente en tu instancia deEventDispatcher
.1
public function addEventListener(type:String, listener:Function, useCapture:Boolean=false, priority:int=0, useWeakReference:Boolean=false):void {
2
_dispatcher.addEventListener(type, listener, useCapture, priority, useWeakReference);
3
}
4
public function dispatchEvent(event:Event):Boolean {
5
return _dispatcher.dispatchEvent(event);
6
}
7
public function hasEventListener(type:String):Boolean {
8
return _dispatcher.hasEventListener(type);
9
}
10
public function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void {
11
_dispatcher.removeEventListener(type, listener, useCapture);
12
}
13
public function willTrigger(type:String):Boolean {
14
return _dispatcher.willTrigger(type);
15
}
Paso 2: un EventDispatcher
estático
Como referencia, implementar esto en una clase estática podría verse así:
1 |
package { |
2 |
|
3 |
import flash.events.*; |
4 |
|
5 |
public class StaticDispatcher { |
6 |
|
7 |
private static var _dispatcher:EventDispatcher = new EventDispatcher(); |
8 |
|
9 |
public static function addEventListener(type:String, listener:Function, useCapture:Boolean=false, priority:int=0, useWeakReference:Boolean=false):void { |
10 |
_dispatcher.addEventListener(type, listener, useCapture, priority, useWeakReference); |
11 |
}
|
12 |
public static function dispatchEvent(event:Event):Boolean { |
13 |
return _dispatcher.dispatchEvent(event); |
14 |
}
|
15 |
public static function hasEventListener(type:String):Boolean { |
16 |
return _dispatcher.hasEventListener(type); |
17 |
}
|
18 |
public static function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void { |
19 |
_dispatcher.removeEventListener(type, listener, useCapture); |
20 |
}
|
21 |
public static function willTrigger(type:String):Boolean { |
22 |
return _dispatcher.willTrigger(type); |
23 |
}
|
24 |
}
|
25 |
}
|
Ten en cuenta que no hay extends
ni implements
, todos los miembros ahora son static
y la propiedad _dispatcher
ahora se crea directamente en la propiedad, en lugar de en el constructor (porque no hay constructor).
Eso es todo
Aunque es rápido de explicar, esta es definitivamente una técnica avanzada, y probablemente no la necesites si te encuentras en un punto en el que enviar sus propios eventos sigue siendo un concepto nuevo. Pero archiva esto en algún lugar de tu mente para que puedas volver a este ejemplo cuando lo necesites.