Статьи

AS3 101: быстрый совет — отправка событий без расширения EventDispatcher

Это редко, но это случается. Иногда вам абсолютно необходимо расширить класс, и этот класс еще не расширяет EventDispatcher . В то же время вам абсолютно необходим ваш класс, чтобы быть EventDispatcher . Поскольку ActionScript 3 не допускает множественное наследование, как вы можете это согласовать?

В других ситуациях, возможно, вы захотите создать класс, в котором есть несколько статических методов, и который на самом деле не предназначен для реализации. Вы также хотели бы иметь возможность отправлять события из этого класса, но вы можете расширить EventDispatcher потому что это разрешает методы экземпляра, а не методы класса.

Давайте посмотрим, как достичь этих целей.


Решение в обоих случаях состоит в том, чтобы создать экземпляр, зависнуть и использовать объект EventDispatcher . То есть new EventDispatcher() объект new EventDispatcher() , не обязательно какой-либо из его подклассов. В случае необходимости расширить что-то еще, вы также можете сделать так, чтобы ваш класс реализовал интерфейс IEventDispatcher .

Процесс идет примерно так:

  1. IEventDispatcher (не для статического класса).

    1
    2
    3
    4
    5
    6
    7
    package {
        import flash.events.*;
        public class ArrayDispatcher extends Array implements IEventDispatcher {
            public function ArrayDispatcher() {
            }
        }
    }
  2. Создайте новый объект EventDispatcher и сохраните его в свойстве.

    1
    2
    3
    4
    private var _dispatcher:EventDispatcher
    public function ArrayDispatcher() {
        _dispatcher = new EventDispatcher();
    }
  3. IEventDispatcher методы, определенные IEventDispatcher , и просто оберните соответствующий метод в вашем экземпляре EventDispatcher .

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    public function addEventListener(type:String, listener:Function, useCapture:Boolean=false, priority:int=0, useWeakReference:Boolean=false):void {
        _dispatcher.addEventListener(type, listener, useCapture, priority, useWeakReference);
    }
    public function dispatchEvent(event:Event):Boolean {
        return _dispatcher.dispatchEvent(event);
    }
    public function hasEventListener(type:String):Boolean {
        return _dispatcher.hasEventListener(type);
    }
    public function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void {
        _dispatcher.removeEventListener(type, listener, useCapture);
    }
    public function willTrigger(type:String):Boolean {
        return _dispatcher.willTrigger(type);
    }

Для справки, реализация этого в статическом классе может выглядеть так:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package {
 
    import flash.events.*;
 
    public class StaticDispatcher {
 
        private static var _dispatcher:EventDispatcher = new EventDispatcher();
 
        public static function addEventListener(type:String, listener:Function, useCapture:Boolean=false, priority:int=0, useWeakReference:Boolean=false):void {
            _dispatcher.addEventListener(type, listener, useCapture, priority, useWeakReference);
        }
        public static function dispatchEvent(event:Event):Boolean {
            return _dispatcher.dispatchEvent(event);
        }
        public static function hasEventListener(type:String):Boolean {
            return _dispatcher.hasEventListener(type);
        }
        public static function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void {
            _dispatcher.removeEventListener(type, listener, useCapture);
        }
        public static function willTrigger(type:String):Boolean {
            return _dispatcher.willTrigger(type);
        }
    }
}

Обратите внимание, что нет extends или implements , все члены теперь static , а свойство _dispatcher теперь создается непосредственно в свойстве, а не в конструкторе (поскольку конструктора нет).


Хотя это легко объяснить, это определенно продвинутый метод, и вам, вероятно, он не понадобится, если вы находитесь в точке, где отправка собственных событий все еще является новой концепцией. Но храните это где-то в уме, чтобы вы могли вернуться к этому примеру, когда вам это нужно.