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));
我還需要了解是什麼問題,但。謝謝。
這是相當特定事件的事情,還是全部通過ActionScript?這是否意味着,至少對於重新調度自定義事件而言,每次都必須創建一個全新的對象,而不是隻重複使用相同的引用? – Panzercrisis
是的,這是特定於事件的。我不知道原因,但Flash Player在重新分派時克隆事件。必須有一些很好的理由,但我從來沒有找到原因。 'clone()'方法的[docs](http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/events/Event.html#clone())只能說你必須在自定義事件中實現'clone()'... –