2013-01-07 97 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()'... –

相關問題