由于事件(Event)的特殊性,在继承(inheritance)中,往往容易被我们所误用。

一个简单的例子:

某类A继承自Sprite

package
{
    import flash.display.Sprite;
    import flash.events.Event;
    public class A extends Sprite
    {
        function A(a:String = "t")
        {
            super();
            trace(a);
            this.addEventListener(Event.ADDED_TO_STAGE, init);
        }
        protected function init(e:Event):void
        {
            trace("A added!");
        }
    }
}

某类B,继承自A

package
{
    import flash.display.Sprite;
    import flash.events.Event;
    public class B extends A
    {
        function B()
        {
            super(’x');
            trace("B");
            //this.addEventListener(Event.ADDED_TO_STAGE, init);
        }
        protected override function init(e:Event):void
        {
            super.init(e);
            trace("B added!");
        }
    }
}

文档类代码:

var b:B = new B();
addChild(b);

可以看到,最优雅的方式是:

  1. 在子类B中,如果继承自父类的函数已经添加了侦听器(这里是构造器),那么事件是会有响应的,不必再添加侦听器
  2. 如果子类B中没有init,那么将执行父类的init回调函数(callback Handler)
  3. 如果子类B中有init,那么有两种可能:一种是把A、B两个类的init全部写为private的,与上面一样,B的init不会被事件触发。不过,这种需求很少遇到
  4. 我们经常遇到的需求是,需要B执行回调函数,但有一些特定的功能。就如同我们常用的override一样,因此,我们把A、B的init都定为protected的;注意,B的init前面要加修饰符override
  5. 然后,在B的init里面,用super.init()调用父类的init函数,剩下的部分写入B需要的逻辑即可。
Still looking for something?

: http://as3blog.com/as3/how-is-addeventlistener-working-in-inheritance/

Post a comment now » Sorry, the comments are closed.

No comments yet.

Sorry, the comment form is closed at this time.