Advertisement
  1. Code
  2. ActionScript

AS3 101: Consejo rapido - envío de eventos sin extender EventDispatcher

Scroll to top
Read Time: 2 min
This post is part of a series called AS3 101.
AS3 101: Events - Basix

() 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:

  1. 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
    }
    
  2. 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
    }
    
  3. Implementa los métodos definidos por IEventDispatcher, y simplemente envuelve el método coincidente en tu instancia de EventDispatcher.

    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.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.