【问题标题】:Why is inheriting from Event not working in this case?为什么在这种情况下从 Event 继承不起作用?
【发布时间】:2013-01-07 17:09:12
【问题描述】:

给定以下代码:

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
}

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

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));

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

【问题讨论】:

    标签: actionscript-3 flash apache-flex inheritance actionscript


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 这是相当特定于事件的东西,还是全部通过 ActionScript?这是否意味着,至少对于重新调度自定义事件,几乎每次都必须创建一个全新的对象,而不是重复使用相同的引用?
    • 是的,这是特定于事件的。我不知道原因,但 Flash Player 在重新调度事件时会克隆事件。一定有什么好的理由,但我从来没有找到原因。 clone() 方法的 docs 仅表示您必须在自定义事件中实现 clone()...
    猜你喜欢
    • 2014-05-05
    • 2017-11-26
    • 2010-12-29
    • 1970-01-01
    • 2021-08-05
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多