2013-01-07 58 views
0

鉴于以下代码:为什么在这种情况下继承Event不起作用?

类CEvent的:

public class CEvent extends Event 
{ 
    public static const TYPE:String = "cEvent"; 

    private var m_strCode:String; 
    public function get code():String 
    { 
     return m_strCode; 
    } 

    public function CEvent(pCode:String, bubbles:Boolean=false, 
      cancelable:Boolean=false) 
    { 
     super(TYPE, bubbles, cancelable); 
     m_strCode = pCode; 
    } 
} 

A类:

dispatchEvent(new CEvent(MY_CONST)) 

B类:

m_a = new A(); 
m_a.addEventListener(CEvent.TYPE, onCEvent); 
. 
. 
. 

private function onCEvent(pEvent:CEvent):void 
{ 
    switch (pEvent.code) 
    {   
     case A.MY_CONST: 
     dispatchEvent(pEvent); 
    } 
} 

C类:

m_b = new B(); 
m_b.addEventListener(CEvent.TYPE, onCEvent); 
. 
. 
. 
private function onCEvent(pEvent:CEvent):void 
{ // breaks right here 
} 

我得到这个错误时,它打破在C级,从A类原调度之后:

Error #1034: Type Coercion failed: cannot convert flash.events::[email protected] to 
<path>.CEvent. 

这似乎并没有做出很大的意义,它似乎完全逆着继承的方式。即使在Adobe的dispatchEvent()实现中存在代码,该代码专门通过并删除通过继承添加的任何内容,并仅分派“正常”事件实例,但应该导致它在B类中中断,而不是C中的中断。

有人能解释一下吗?谢谢。

编辑:通过改变B类的代码来做到这一点的方式,而不是使一切工作只是罚款:

dispatchEvent(new CEvent(pEvent.code)); 

我还需要了解是什么问题,但。谢谢。

回答

6

发生错误是因为您尚未在自定义事件中实施clone()方法。

当您重新分派事件(在您的C类中)时,Flash会克隆该事件,而不是仅重新分派原始事件。

因此重新调度的事件是普通的旧Event对象,因为这是默认的clone()方法返回的内容。

通常,您应该始终为您的自定义事件实施clone()方法。这是非常简单的事情。在这种情况下,它应该看起来像这样:

override public function clone():Event 
{ 
    return new CEvent(m_strCode, bubbles, cancelable); 
} 
+0

这是相当特定事件的事情,还是全部通过ActionScript?这是否意味着,至少对于重新调度自定义事件而言,每次都必须创建一个全新的对象,而不是只重复使用相同的引用? – Panzercrisis

+2

是的,这是特定于事件的。我不知道原因,但Flash Player在重新分派时克隆事件。必须有一些很好的理由,但我从来没有找到原因。 'clone()'方法的[docs](http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/events/Event.html#clone())只能说你必须在自定义事件中实现'clone()'... –

相关问题