Учитывая следующий код:
Класс 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;
}
}
Класс А:
dispatchEvent(new CEvent(MY_CONST))
Класс Б:
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);
}
}
Класс С:
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.
В этом нет большого смысла и, похоже, полностью противоречит принципу работы наследования. Даже если бы в реализации Adobe dispatchEvent () был код, который специально проходит и удаляет все, что было добавлено посредством наследования, и просто отправляет «нормальный» экземпляр Event, это должно привести к его поломке в классе B, а не C.
Может кто-нибудь объяснить? Благодарю.
Изменить: Кстати, изменение кода класса B для этого вместо этого заставляет все работать нормально:
dispatchEvent(new CEvent(pEvent.code));
Однако мне все еще нужно понять, в чем проблема. Спасибо.
1 ответ
Ошибка возникает из-за того, что вы не реализовали метод clone()
в своем настраиваемом событии.
Когда вы повторно отправляете событие (в вашем классе C), Flash клонирует событие, а не просто повторно отправляет исходное событие.
Таким образом, повторно отправляемое событие представляет собой простой старый объект Event
, потому что это то, что возвращает метод clone()
по умолчанию.
В общем, вы всегда должны реализовывать метод clone()
для своих пользовательских событий. Это довольно просто сделать. В этом случае это должно выглядеть примерно так:
override public function clone():Event
{
return new CEvent(m_strCode, bubbles, cancelable);
}
Похожие вопросы
Новые вопросы
actionscript-3
ActionScript 3 (AS3) - это язык объектно-ориентированного программирования (ООП) с открытым исходным кодом для платформ Adobe Flash и AIR. AS3 широко используется для RIA, мобильных приложений и настольных приложений. (ActionScript 3 является диалектом ECMAScript.)
clone()
скажите только, что вы должны реализоватьclone()
в своих пользовательских событиях ...