开发者

Override Clone() in custom event for AS3... need help

I have created a custom even class which is pretty basic. But when calling an event and then relaying that event to another class I have encountered the "cannot transform thisEvent into thisOtherEvent" error.

I realize this is because I needed to override the Clone function in my custom event like so:

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 MyC开发者_开发知识库ustomEvents($type, $bubbles, $cancelable);
  }

 }
}

However I am still getting this error when I dispatch the event. Anything else I might be missing?

here is the error: TypeError: Error #1034: Type Coercion failed: cannot convert com.greensock.events::TransformEvent@d8df709 to com.customEvents.MyCustomEvents.

I tried casting the event in the code like so:

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

Still no luck.

UPDATE:

Ok, seems like the problem is in the greensock Transform library. When the event handler for my custom event is called, I run a function of the TransformManager class.

_manager.deleteSelection();

Inside that class it dispatched a TransformEvent. Not sure why, but it is reading that delete event as a MyCustomEvent.


/**
 * @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);
        }
    }
}

"When creating your own custom Event class, you must override the inherited Event.clone() method in order for it to duplicate the properties of your custom class. If you do not set all the properties that you add in your event subclass, those properties will not have the correct values when listeners handle the redispatched event."


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);
    }
}
}


Don't know if that's it but you have an extra parameter $info:Object into your custom event, but you don't pass it in your clone contructor.

return new MyCustomEvents(type, info, bubbles, cancelable);


I think you need the clone function to return a MyCustomEvents type. Not an Event type. And you need to add the info parameter as stated by the previous poster.

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜