欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Flex自定义事件时为什么要重载clone()方法(转载) 博客分类: Flex Flex自定义事件重载clone

程序员文章站 2024-03-17 09:48:34
...

 

声明:转载

以前在学习定义事件的时候一直不太明白为什么要重载克隆方法,虽然官方的说法是必须要这样做以便复制自定义事件中的属性,但是实际使用中不重载也没有出现过问题,于是这个问题就这样糊里糊涂的隐藏了下来;直至今天看到这篇文章,才明白了。
原来,一个定义事件如果不重载clone方法一般情况下不出问题,但是如果这个事件要进行中继的话,也就是说被继续派发下去的情况下,重载就非常有必要了,比如:

 

private function relay(customEvent:CustomEvent):void
{
	dispatchEvent(customEvent);
}

 

这个relay方法就是对CustomEvent的第一次响应,然后在这个方法里继续向外派发这个事件,由另一个事件处理器来继续处理;在重新派发事件的过程中,flash内部的事件框架将会调用事件的clone方法来生成这个事件的一个新实例, 如果没有重载clone方法,也就是说使用的是默认的重载方法,那么新的事件实例就是一个普通的event,而不是自定义事件,这时,在下一个事件监听器 中如果期待的是自定义事件的话,就会发生:Error #1034: 强制转换类型失败:无法将 flash.events::Event@5e514f1 转换为.....的错误;
下面就一个例子来说明这个自定义事件的使用方法,下面的例子中EnableChangeEvent 没有重载clone方法(注释掉了),结果在主应用中的relistenEvent监听器方法中就无法得到这个EnableChangeEvent,如果将自定义事件的注释去掉,就正常了。

 

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"
xmlns:MyComp="mycomponents.*" creationComplete="initApp()">
<mx:Script>
<![CDATA[
import myevents.EnableChangeEvent;
import mx.controls.Alert;

private function initApp():void{
	this.addEventListener(EnableChangeEvent.ENABLE_CHANGED,relistenEvent);
}

private function enableChangedListener(event:EnableChangeEvent):void
{
	// Handle event.
	myTA.text = "Event isEnabled: "+event.isEnabled;
dispatchEvent(event);
}

private function relistenEvent(event:EnableChangeEvent):void{
	Alert.show("isEnabled? "+event.isEnabled,"EventHandled");
}
]]>
</mx:Script>
<MyComp:MyButton label="ClickMe" enableChanged="enableChangedListener(event)"/>
<mx:TextArea id="myTA"/
</mx:Application>
<?xml version="1.0" encoding="utf-8"?>
<mx:Button xmlns:mx="http://www.adobe.com/2006/mxml"
click="buttonClickHandler()">
<mx:Script>
<![CDATA[
import myevents.EnableChangeEvent;

public function buttonClickHandler():void{
	dispatchEvent(new EnableChangeEvent('enableChanged',true));
}
]]>
</mx:Script>
<mx:Metadata>
	Event(name="enableChanged", type="myevents.EnableChangeEvent")]
</mx:Metadata>
</mx:Button>

 

package myevents
{
import flash.eventsEvent;

public class EnableChangeEvent extends Event
{
	public static const ENABLE_CHANGED:String="enableChanged";

	public var isEnabled:Boolean;

	public function EnableChangeEvent(type:String, isEnabled:Boolean=false)
	{
		super(type);
		this.isEnabled=isEnabled;
	}

	//override public function clone():Event
	//{
		//return new EnableChangeEvent(type, isEnabled);
	//}
}
}