【转】flash.events.IEventDispatcher介绍
转自:http://hi.baidu.com/ambitionwzj1818/blog/item/06816c24ad053b08908f9d13.html
如果你一个类,比如
public class fatherClass { public function fatherClass() { } }
然后又写一个sonClass类,继承这个fatherClass:
public class sonClass extends fatherClass { public function sonClass() { } }
这时候你的sonClass要添加发送消息的功能,而它继承的父类没有这个功能,要怎么办?
这个时候就要实现IEventDispatcher接口,可以这样写:
import flash.events.IEventDispatcher; import flash.events.EventDispatcher; import flash.events.Event;
/**如何使用IEventDispatcher * 1、当需要一个可以发送事件的类; * 2、这个类继承自某个类,并且父类没有发送事件的能力; * 3、这个情况下该类不能继承自EventDispatcher类了,但他可以 * 通过实现IEventDispatcher接口来获得发送事件的能力; * 4、本质上说,他还是在使用EventDispatcher; */ public class InfaceEventDispatcher implements IEventDispatcher { private var dispatcher:EventDispatcher; public var testPara:String = "访问参数成功"; public function InfaceEventDispatcher() { dispatcher = new EventDispatcher(this); }
public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void { dispatcher.addEventListener(type, listener, useCapture, priority); }
public function dispatchEvent(evt:Event):Boolean { /** * 完成了发送事件的动作并且返回一个boolean值 */ return dispatcher.dispatchEvent(evt); }
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); } }
为什么要实现IEventDispatcher接口呢?看起来都是里面的一个EventDispatcher在起作用啊,不实现这个接口可以吗?比如:
package myEvent { import flash.events.EventDispatcher; import flash.events.Event; /** * 1、要使一个类具有事件发送能力,并不一定要实现IEventDispatcher接口; * 2、但是如果不实现这个接口,无法将this的引用注入到dispatcher里面, * 发送事件是由该类里面的dispatcher发送,接收是由该类里面的dispatcher * 接收,虽然该类是可以发送、接收事件,删除侦听,但是侦听函数的target * 对象指向的是dispatcher,而不是该类本身,所以这样的定义方法在实际应 * 用中是不可取的; * 3、在这个类里,我们不实现这个接口,我们只定义我们需要用到的方法; * */ public class nofaceEventDispatcher { private var dispatcher:EventDispatcher; public var testPara:String = "访问参数成功"; public function nofaceEventDispatcher() { //dispatcher = new EventDispatcher(this); dispatcher = new EventDispatcher(); } public function addEventListener(type:String, listener:Function):void { dispatcher.addEventListener(type, listener); } public function dispatchEvent(evt:Event):Boolean { return dispatcher.dispatchEvent(evt); } public function removeEventListener(type:String, listener:Function):void { dispatcher.removeEventListener(type, listener); } } }
你会发现你无法将当前类的引用注入到EventDispatcher里,因为类型不对。
尽管这样写dispatcher = new EventDispatcher();也是可以的,一样会有收发消息的功能,
但是做是有问题的。来看主类:
import flash.display.Sprite; import flash.events.Event; import myEvent.InfaceEventDispatcher; import myEvent.nofaceEventDispatcher; import flash.events.EventDispatcher; public class Main extends Sprite { private var inEvent:InfaceEventDispatcher; private var noEvent:nofaceEventDispatcher; public function Main() { init(); } private function init():void { /* inEvent = new InfaceEventDispatcher(); inEvent.addEventListener("doSomething", onSomethingHandler); inEvent.dispatchEvent(new Event("doSomething")); */ noEvent = new nofaceEventDispatcher(); noEvent.addEventListener("doSomething", onSomethingHandler); noEvent.dispatchEvent(new Event("doSomething")); } private function onSomethingHandler(e:Event):void { trace("发送事件成功!"); trace(e.target); //trace(e.target.testPara); /** * e.target: * InfaceEventDispatcher:[object InfaceEventDispatcher] * nofaceEventDispatcher:[object EventDispatcher] */ /** * e.target.testPara: * InfaceEventDispatcher:访问成功 * nofaceEventDispatcher:报错 */ } }
因此,必须要实现IEventDispatcher接口的,才能有一个完整且正常的消息发送机制。