Это редко, но это случается. Иногда вам абсолютно необходимо расширить класс, и этот класс еще не расширяет EventDispatcher
. В то же время вам абсолютно необходим ваш класс, чтобы быть EventDispatcher
. Поскольку ActionScript 3 не допускает множественное наследование, как вы можете это согласовать?
В других ситуациях, возможно, вы захотите создать класс, в котором есть несколько статических методов, и который на самом деле не предназначен для реализации. Вы также хотели бы иметь возможность отправлять события из этого класса, но вы можете расширить EventDispatcher
потому что это разрешает методы экземпляра, а не методы класса.
Давайте посмотрим, как достичь этих целей.
Шаг 1: Как это сделать
Решение в обоих случаях состоит в том, чтобы создать экземпляр, зависнуть и использовать объект EventDispatcher
. То есть new EventDispatcher()
объект new EventDispatcher()
, не обязательно какой-либо из его подклассов. В случае необходимости расширить что-то еще, вы также можете сделать так, чтобы ваш класс реализовал интерфейс IEventDispatcher
.
Процесс идет примерно так:
-
IEventDispatcher
(не для статического класса).1234567package {import flash.events.*;public class ArrayDispatcher extends Array implements IEventDispatcher {public function ArrayDispatcher() {}}} -
Создайте новый объект
EventDispatcher
и сохраните его в свойстве.1234private var _dispatcher:EventDispatcherpublic function ArrayDispatcher() {_dispatcher = new EventDispatcher();} -
IEventDispatcher
методы, определенныеIEventDispatcher
, и просто оберните соответствующий метод в вашем экземпляреEventDispatcher
.010203040506070809101112131415public 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);}
Шаг 2: Статический EventDispatcher
Для справки, реализация этого в статическом классе может выглядеть так:
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
теперь создается непосредственно в свойстве, а не в конструкторе (поскольку конструктора нет).
Это все
Хотя это легко объяснить, это определенно продвинутый метод, и вам, вероятно, он не понадобится, если вы находитесь в точке, где отправка собственных событий все еще является новой концепцией. Но храните это где-то в уме, чтобы вы могли вернуться к этому примеру, когда вам это нужно.