AS3中自定义事件发送发者的三种方法

在AS3中实现自定义事件发送者有多种方法,这几天第四次看黑羽的殿堂之路,顺势就写下了,其本质只有一个EventDispatcher。


AS3是面向对象的语言,面向对象思想解析如下图:

AS3中自定义事件发送发者的三种方法_第1张图片

所以在这里我们也有多种方法来实现自定义事件发送类。

这里有三种:

1.通过继承来实现;

2.通过复合来实现;

3.通过实现接口来实现。

在AS3事件中有3个要素,如下图所示,我们现在要实现的是自定义一个EventDispatcher。

AS3中自定义事件发送发者的三种方法_第2张图片

第一种方法:继承EventDispatcher来实现

package
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.EventDispatcher;
	
	/**
	 * ...
	 * @author aisajiajiao
	 * 使用继承来实现
	 */
	
	public class CustomEventDispatcherDemo extends Sprite
	{
	
		public function CustomEventDispatcherDemo()
		{
			var dispatcher:SampleEventDispatcher = new SampleEventDispatcher();
			//不推荐直接使用字符串表示事件类型,这里只是作为演示
			dispatcher.addEventListener("Custom",actionListener);
			dispatcher.dispatchEvent(new Event("Custom"));
		}
		
		private function actionListener(e:Event):void
		{
			trace("自定义事件发送类" + e);
		}
	}
}

import flash.events.Event;
import flash.events.EventDispatcher;

//继承
class SampleEventDispatcher extends EventDispatcher
{
	//这里可以写一些自己需要的代码
}

第二种方法:复合来实现

package
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.EventDispatcher;
	
	/**
	 * ...
	 * @author aisajiajiao
	 * 使用复合来实现
	 */
	
	public class CustomEventDispatcherDemo2 extends Sprite
	{
	
		public function CustomEventDispatcherDemo2()
		{
			var dispatcher:SampleEventDispatcher = new SampleEventDispatcher();
			
			//这里我们可以看出使用复合之后,该类就不能再看做EventDispatcher对象了
			dispatcher.getEventDispatcher().addEventListener("Custom",actionListener);
			dispatcher.getEventDispatcher().dispatchEvent(new Event("Custom"));
		}
		
		private function actionListener(e:Event):void
		{
			trace("自定义事件发送类" + e);
		}
	}
}

import flash.events.Event;
import flash.events.EventDispatcher;

class SampleEventDispatcher
{
	private var _dispatcher:EventDispatcher;
	
	public function SampleEventDispatcher()
	{
		_dispatcher = new EventDispatcher();
	}
	
	//get方法
	public function getEventDispatcher():EventDispatcher
	{
		return _dispatcher;
	}
}

第三种方法,实现IEventDispatcher接口。

package
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.EventDispatcher;
	
	/**
	 * ...
	 * @author aisajiajiao
	 * 使用IEventDispatcher接口
	 */
	
	public class CustomEventDispatcherDemo3 extends Sprite
	{
	
		public function CustomEventDispatcherDemo3()
		{
			var dispatcher:SampleEventDispatcher = new SampleEventDispatcher();
			
			//不推荐直接使用字符串表示事件类型,这里只是作为演示
			dispatcher.addEventListener("Custom",actionListener);
			dispatcher.dispatchEvent(new Event("Custom"));
		}
		
		private function actionListener(e:Event):void
		{
			trace("自定义事件发送类" + e);
		}
	}
}

import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IEventDispatcher;

//这样灵活性非常大,可以在这里实现你想要的各种功能
class SampleEventDispatcher implements IEventDispatcher
{
	public var _dispatcher:EventDispatcher;
	
	public function SampleEventDispatcher()
	{
		_dispatcher = new EventDispatcher();
	}
	
	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);
	}
	
	//注意这里的参数个数是与addEventListener数目不同的,仅有3个
	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);
	}
}

所有自定义事件最终的输出结果如下图:




你可能感兴趣的:(function,String,Class,语言,import)