自定义事件为什么要重载clone方法

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

[c-sharp]  view plain copy
  1. private function relay(customEvent:CustomEvent):void  
  2. {  
  3.      dispatchEvent(customEvent);  
  4. }  

 

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

下面就一个例子来说明这个自定义事件的使用方法,下面的例子中EnableChangeEvent 没有重载clone方法(注释掉了),结果在主应用中的relistenEvent监听器方法中就无法得到这个EnableChangeEvent,如果将自定义事件的注释去掉,就正常了;

[c-sharp]  view plain copy
  1. <!---------------------------------- TestCustomEvent.mxml -------------------------->  
  2. <?xml version="1.0" encoding="utf-8"?>  
  3. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" creationComplete="initApp()" xmlns:local="*">  
  4. <mx:Script>  
  5.     <![CDATA[  
  6.         //import myevents.EnableChangeEvent;  
  7.         import mx.controls.Alert;  
  8.           
  9.         private function initApp():void  
  10.         {  
  11.             this.addEventListener(EnableChangeEvent.ENABLE_CHANGED,relistenEvent);  
  12.         }   
  13.           
  14.         private function enableChangedListener(event:EnableChangeEvent):void  
  15.         {  
  16.             // Handle event.myTA.text = "Event isEnabled: "+event.isEnabled;  
  17.             dispatchEvent(event);  
  18.         }  
  19.           
  20.         private function relistenEvent(event:EnableChangeEvent):void  
  21.         {  
  22.             Alert.show("isEnabled? "+event.isEnabled,"EventHandled");  
  23.         }  
  24.     ]]>  
  25. </mx:Script>  
  26.   
  27. <local:MyButton label="ClickMe" enableChanged="enableChangedListener(event)"/>  
  28. <mx:TextArea id="myTA"/>   
  29. </mx:Application>  

 

[c-sharp]  view plain copy
  1. <!---------------------------------- mycomponents.MyButton.mxml-------------------------->  
  2. <?xml version="1.0" encoding="utf-8"?>  
  3. <mx:Button xmlns:mx="http://www.adobe.com/2006/mxml" click="buttonClickHandler()">  
  4. <mx:Script>  
  5.     <![CDATA[  
  6.         //import myevents.EnableChangeEvent;  
  7.         public function buttonClickHandler():void  
  8.         {  
  9.             dispatchEvent(new EnableChangeEvent('enableChanged',true));  
  10.         }  
  11.         ]]>  
  12. </mx:Script>  
  13.     <mx:Metadata>  
  14.         [Event(name="enableChanged", type="EnableChangeEvent")]  
  15.     </mx:Metadata>  
  16. </mx:Button>  

myevents.EnableChangeEvent.as

[c-sharp]  view plain copy
  1. package  
  2. {  
  3.     import flash.events.Event;   
  4.     public class EnableChangeEvent extends Event  
  5.     {  
  6.          // Define static constant.  
  7.          public static const ENABLE_CHANGED:String="enableChanged";  
  8.          // Define a public variable to hold the state of the enable property.  
  9.          public var isEnabled:Boolean;  
  10.          // Public constructor.  
  11.          public function EnableChangeEvent(type:String, isEnabled:Boolean=false)  
  12.          {  
  13.              // Call the constructor of the superclass.  
  14.              super(type);  
  15.              // Set the new property.  
  16.             

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值