0

次のコードが与えられます:

クラス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
}

クラスAから最初にディスパッチした後、クラスCで破損すると、このエラーが発生します。

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

これはあまり意味がないようで、継承の仕組みに完全に反しているようです。AdobeのdispatchEvent()の実装に、継承によって追加されたものをすべて処理して削除し、「通常の」イベントインスタンスをディスパッチするコードがあったとしても、CではなくクラスBで破損するはずです。

誰か説明してもらえますか?ありがとう。

編集:ちなみに、これを行うためにクラス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 に答える