0

给定以下代码:

C类事件:

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
}

在最初从 A 类调度它之后,当它在 C 类中断时出现此错误:

Error #1034: Type Coercion failed: cannot convert flash.events::Event@9861089 to
<path>.CEvent.

这似乎没有多大意义,而且似乎完全违背了继承的工作方式。即使 Adob​​e 的 dispatchEvent() 实现中有代码专门通过并删除通过继承添加的任何内容,并且只是分派一个“正常”事件实例,这应该会导致它在 B 类而不是 C 类中中断。

有人可以解释一下吗?谢谢。

编辑:顺便说一下,更改 B 类的代码来执行此操作会使一切正常:

dispatchEvent(new CEvent(pEvent.code));

我仍然需要了解问题所在。谢谢。

4

1 回答 1

6

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

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

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

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

override public function clone():Event
{
    return new CEvent(m_strCode, bubbles, cancelable);
}
于 2013-01-07T17:21:35.683 回答