`
joe.feng
  • 浏览: 133361 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Flex自定义事件时为什么要重载clone()方法(转载)

    博客分类:
  • Flex
阅读更多

 

声明:转载

以前在学习定义事件的时候一直不太明白为什么要重载克隆方法,虽然官方的说法是必须要这样做以便复制自定义事件中的属性,但是实际使用中不重载也没有出现过问题,于是这个问题就这样糊里糊涂的隐藏了下来;直至今天看到这篇文章,才明白了。
原来,一个定义事件如果不重载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);
	//}
}
}
 

 

 

分享到:
评论

相关推荐

    flex事件机制的分发

    - `clone()`:覆盖`Event`的`clone()`方法,用于创建事件的副本。 5. **事件分发**: - `EventDispatcher`是Flex中的事件调度器,负责处理事件的分发。在示例中,`CustomEvent`类使用静态的`EventDispatcher`实例...

    FLEX 事件机制-自定义事件介绍

    最后,要触发自定义事件,你需要从事件源(通常是组件)调用`dispatchEvent`方法: ```actionscript dispatchEvent(new MyEvent(MyEvent.MY_EVENT, false, false, "自定义数据")); ``` 自定义事件的一个重要注意...

    改造之后的fullCalendar(改事件背景、标题自定义、无星期、左右按钮)

    首先,我们需要在创建事件时添加一个代表颜色的属性,例如`color`。然后,在fullCalendar的初始化配置中,利用`eventColor`或者`eventBackgroundColor`来指定事件的颜色依据。例如: ```javascript $('#calendar')....

    flex 事件学习

    自定义事件通常通过继承`Event`类或其子类并重写`clone()`和`toString()`方法来创建。 总结来说,Flex事件学习涵盖了事件的定义、派发、监听以及处理,是构建交互式Flex应用的关键。通过理解和熟练运用这些概念,...

    Java clone方法使用

    详细的描述了Java中 clone方法使用

    Java中clone方法共6页.pdf.zip

    为了实现深拷贝,通常需要在自定义类中重写`clone()`方法,并且确保所有的引用字段也被正确复制。 4. **安全性与并发考虑**: - `clone()`方法不会调用构造函数,因此不能用于初始化新对象。此外,在多线程环境中...

    java clone

    2. 避免空指针异常:在覆盖`clone`方法时,确保检查并处理可能的空引用,以防止`NullPointerException`。 3. 类的可变性:如果类的对象是可变的(即包含可变成员变量),那么克隆后的对象也可能是可变的,这可能导致...

    Clone详解.doc

    - 重写`clone()`方法时,需要处理非基本类型的成员变量,确保它们也能够被正确地复制。 总的来说,Java中的克隆机制提供了复制对象的能力,这在很多场景下都非常有用,比如数据备份、并发操作、状态恢复等。但需要...

    clone()示例源码

    在Java编程语言中,`clone()`方法是一个非常重要的概念,特别是在处理对象复制和克隆时。这个方法源自`Object`类,是所有Java类的基类。`clone()`的使用通常涉及到深度复制和浅复制的概念,这两者在数据结构和内存...

    java Clone

    在实现`clone`方法时,通常我们会覆盖类中的`clone`方法,以便进行特定类型的克隆操作。例如: ```java public class CloneClass implements Cloneable { public int aInt; @Override protected Object clone()...

    Jlink V8固件升级提示Clone的解决方法!

    在使用高版本版KEIL时,提示要升级固件,升级后就出现JLINK is Clone的提示!“the emulator is JLink-Clone, the segger software only support orginal segger device” 然后闪退,IDE崩溃关闭! 解决方案: 1....

    Java的clone方法[归类].pdf

    因此,如果我们想要实现深复制,需要自定义`clone()`方法,并确保所有嵌套的对象也被正确复制。 在`A`类中,我们首先需要实现`Cloneable`接口,这是一个标记接口,表明类支持克隆。然后,我们需要重写`clone()`方法...

    clone()方法示例(对象克隆)_对象克隆_nervouse78_源码

    在Java编程语言中,`clone()`方法是一个非常重要的概念,特别是在处理对象复制和数据持久化时。本示例将深入探讨`clone()`方法的工作原理、使用场景以及如何在实际编程中应用。首先,我们来理解一下`clone()`方法的...

    Java中的clone方法详解_动力节点Java学院

    Java中的clone方法详解_动力节点Java学院,动力节点口口相传的Java黄埔军校

    java_clone用法

    要实现深拷贝,通常需要在子类中重写`clone`方法,并确保复制所有引用类型的字段。例如,对于上述的`Account`类,可以这样实现: ```java @Override public Account clone() throws CloneNotSupportedException { ...

    java clone的小例子

    要使用`clone()`方法,一个类需要实现`Cloneable`接口。这个接口没有定义任何方法,但它的存在表明这个类允许被克隆。如果一个类没有实现`Cloneable`接口,然后尝试调用`clone()`,系统会抛出`...

    flex试题打包面试题挺好的

    - **应用场景**:当多个类之间需要共享一些资源或方法时,但又不希望这些资源对外部可见,可以使用`internal`包来实现。 ### 9. 如何阻止事件的传播 - **方法**:`stopPropagation()`方法。 ```actionscript ...

    Java clone方法详解及简单实例

    要在自定义类中使用`clone`,首先,你的类需要实现`Cloneable`接口,这是一个空接口,不包含任何方法,但它是`clone`方法工作的标志。实现`Cloneable`接口表明你的类支持克隆。然后,你需要覆盖`clone`方法,通常...

Global site tag (gtag.js) - Google Analytics