Учитывая следующий код:

Класс 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));

Однако мне все еще нужно понять, в чем проблема. Спасибо.

0
Panzercrisis 7 Янв 2013 в 21:09

1 ответ

Лучший ответ

Ошибка возникает из-за того, что вы не реализовали метод clone() в своем настраиваемом событии.

Когда вы повторно отправляете событие (в вашем классе C), Flash клонирует событие, а не просто повторно отправляет исходное событие.

Таким образом, повторно отправляемое событие представляет собой простой старый объект Event, потому что это то, что возвращает метод clone() по умолчанию.

В общем, вы всегда должны реализовывать метод clone() для своих пользовательских событий. Это довольно просто сделать. В этом случае это должно выглядеть примерно так:

override public function clone():Event
{
    return new CEvent(m_strCode, bubbles, cancelable);
}
6
Sunil D. 7 Янв 2013 в 21:21
Это что-то довольно специфичное для событий, или это все через ActionScript? И означает ли это, что, по крайней мере, для повторной отправки пользовательских событий, новый объект в значительной степени должен создаваться каждый раз, а не просто использовать одну и ту же ссылку повторно?
 – 
Panzercrisis
7 Янв 2013 в 21:26
2
Да, это относится к событиям. Я не знаю причины, но Flash Player клонирует события при их повторной отправке. Для этого должна быть какая-то веская причина, но я так и не узнал почему. документы для метода clone() скажите только, что вы должны реализовать clone() в своих пользовательских событиях ...
 – 
Sunil D.
7 Янв 2013 в 21:32