当你自定义并继承Event类时,有一个重要的方法必须覆盖。这个方法就是Event.clone():Event
Flash CS3中的中文帮助写得很简单,并没有说明什么原因。
原因是dispatchEvent(e:Event)方法,如果e不是通过:
var e:CustomEvent = new CustomEvent('custom');
//广播e事件
dispatchEvent(e);//e不会调用e.clone();方法
而是通过以下方式获得的:
addEventListener('custom', customFunc);
//此方法来自监听CustomEvent的'custom'事件
function customFunc(e:CustomEvent):void{
//再广播此事件
dispatchEvent(e);//这时e会调用e.clone();方法
}
如果不重新定义e.clone()方法,则执行dispatchEvent(e)时,会自动调用CustomEvent父类(Event)的clone()方法,则clone出来的事件是Event而不是自定义的CustomEvent,对于CustomEvent里添加的属性或方法就不会存在,因为广播出去的事件为Event类而不是CustomEvent类。
以此类是我自定义的一个Webservice类的事件类。
package com.wlash.data {
import flash.events.Event;
/**
* WebservicesEvent.
* annotate here for this class.
*
*/
public class WebServicesEvent extends Event {
/** those value are 'URL.Not.Found', 'Call.Error', 'Security.Error', 'Call.Security.Error' */
public var code:String;
/** detail infomation */
public var info:String;
/** call remote method name */
public var method:String;
//*************************[READ|WRITE]*************************************//
//*************************[READ ONLY]**************************************//
//*************************[STATIC]*****************************************//
/**
* define ioerror event, when call remote method error or can't find the webservices url.
* code is 'URL.Not.Found' or 'Call.Error'.
* @eventType callSecurityError
*/
static public const IO_ERROR:String = 'ioerror';
/**
* define securityError event, when call remote method security error.
* code is 'Security.Error' or 'Call.Security.Error'.
* @eventType securityError
*/
static public const SECURITY_ERROR:String = 'securityError';
/**
* CONSTRUCTION FUNCTION.
* Create this class BY [new WebservicesEvent();]
* @param type like IO_ERROR, SECURITY_ERROR ...
* @param code value are Call.Error or Security.Error or URL.Not.Found or Call.Security.Error.
* @param info the detail infomation
* @param method method name if not null
*/
public function WebServicesEvent(type:String, code:String='',info:String='',method:String=null) {
//参照Adobe Event的子类,构造函数至少有三个参数,(type, bubbles, cancelable)三个参数,虽然对于部分Event的子类后两个参数是无用的,但也定义。如果再有额外的参数,则是在cancelable后边继续定义。
//我在这里是贪图方便并没有按照Adobe的方法来定义Event的子类
super(type, false, false);
this.info = info;
this.code = code;
this.method = method;
}
//*************************[PUBLIC METHOD]**********************************//
/**
* format output data
* @return [Event=WebServicesEvent, type, code, info, method, data]
*/
override public function toString():String {
//如果重新定义此类,可以通过trace(e)得到自定义的格式,不是必要的。
return formatToString('WebServicesEvent:', 'type', 'code', 'info', 'method');
}
/**
* @inheritDoc
*/
override public function clone():Event {
//必须覆盖此方法,且返回值只能为Event,而不是自定义的WebServicesEvent.
//当要监听函数中接收到此事件后,可以使用WebServicesEvent(e)或e as WebServicesEvent方式转为WebServicesEvent类。
return new WebServicesEvent(type, code, info, method);
}
//*************************[INTERNAL METHOD]********************************//
//*************************[PROTECTED METHOD]*******************************//
//*************************[PRIVATE METHOD]*********************************//
//*************************[STATIC METHOD]**********************************//
}
}
发表回复