Переопределить Clone () в пользовательском событии для AS3 ... нужна помощь - PullRequest
1 голос
/ 27 августа 2010

Я создал собственный класс четности, который довольно прост. Но при вызове события и последующей передаче этого события другому классу я обнаружил ошибку «невозможно преобразовать thisEvent в thisOtherEvent».

Я понимаю, что это потому, что мне нужно было переопределить функцию Clone в моем настраиваемом событии следующим образом:

package com
{

 import flash.disply.*;
 import flash.events.Event;

 public class MyCustomEvents extends Event
 {

  public static const SOME_EVENT:String = "some_event";
  public var info:Object;

  public function MyCustomEvents($type:String, $info:Object,$bubbles:Boolean = false, $cancelable:Boolean = false)
  {

   super($type, $bubbles, $cancelable);
   this.info = $info;

  }

  public override function clone():Event {
   return new MyCustomEvents($type, $bubbles, $cancelable);
  }

 }
}

Однако я все еще получаю эту ошибку, когда отправляю событие. Что-нибудь еще, что я мог бы пропустить?

вот ошибка: TypeError: Error #1034: Type Coercion failed: cannot convert com.greensock.events::TransformEvent@d8df709 to com.customEvents.MyCustomEvents.

Я пытался привести событие в коде так:

var deleteImgEvent:MyCustomEvent = new MyCustomEvent(MyCustomEvents.IMAGE_DELETE, {imgData: getImg}, true, false); this.dispatchEvent(deleteImgEvent as MyCustomEvents);

Все еще не повезло.

UPDATE:

Хорошо, похоже, проблема в библиотеке преобразования greensock. Когда вызывается обработчик события для моего пользовательского события, я запускаю функцию класса TransformManager.

_manager.deleteSelection();

Внутри этого класса он отправил TransformEvent. Не знаю почему, но он читает событие удаления как MyCustomEvent.

Ответы [ 4 ]

2 голосов
/ 17 декабря 2010
/**
 * @usage
 * var myEvent:CustomEvent = new CustomEvent(CustomEvent.EVENT_TYPE_A, { integerRelatedToEvent: 5, stringRelatedToEvent: 'easy' });
 * addEventListener(CustomEvent.EVENT_TYPE_A, traceCustomEvent);
 * dispatch(myEvent);
 * function traceCustomEvent ($e:CustomEvent):void {
 *  trace($e.type);
 * }
 */
package {
    import flash.events.Event;

    public class CustomEvent extends Event {
        // Types:
        public static const EVENT_TYPE_A:String = 'CustomEvent.EVENT_TYPE_A';
        public static const EVENT_TYPE_B:String = 'CustomEvent.EVENT_TYPE_B';
        // Components:
        private var _customDatum:Object;
        public function get customDatum ():Object { return _customDatum; }


        public function CustomEvent ($type:String, $customDatum:Object) {
            super($type);
            _customDatum = $customDatum;
        }

        public override function clone ():Event {
            return new CustomEvent(type, _customDatum);
        }
    }
}

"При создании собственного события класс, вы должны переопределить унаследованный Метод Event.clone () для этого дублировать свойства вашего Пользовательский класс . Если вы не установите все свойства, которые вы добавляете в свой подкласс события, эти свойства будут не имеют правильные значения, когда слушатели обрабатывают заново отправленные событие. "

1 голос
/ 16 апреля 2012
package com.events;
{
import flash.events.Event;
public class XMLLoaderEvent extends Event
{
    public static const XML_LOADED:String = "XML_Loaded";
    public var data:*;
    public var properties:Object;

    public function XMLLoaderEvent( type:String,_data:*,bubbles:Boolean = false,cancelable:Boolean = false):void
    {
        super( type, bubbles, cancelable );
        data = _data;
    }

    // Override clone
    override public function clone():Event
    {
        return new XMLLoaderEvent( type, data, bubbles, cancelable);
    }
}
}
0 голосов
/ 28 августа 2010

Я думаю, что вам нужна функция клона для возврата типа MyCustomEvents.Не тип события.И вам нужно добавить информационный параметр, как указано в предыдущем постере.

package com {

    import flash.display.*;
    import flash.events.Event;

    public class MyCustomEvents extends Event {

    public static const SOME_EVENT:String = "some_event";
    public var info:Object;

        public function MyCustomEvents($type:String, $info:Object,$bubbles:Boolean = false, $cancelable:Boolean = false) {
            super($type, $bubbles, $cancelable);
            this.info = $info;
        }
        public override function clone():MyCustomEvents {
            return new MyCustomEvents(this.type, this.info, this.bubbles, this.cancelable);
        }
    }
}
0 голосов
/ 27 августа 2010

Не знаю, так ли это, но у вас есть дополнительный параметр $info:Object в вашем пользовательском событии, но вы не передаете его в свой конструктор клонов.

return new MyCustomEvents(type, info, bubbles, cancelable);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...