由于事件(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);
可以看到,最优雅的方式是:
- 在子类B中,如果继承自父类的函数已经添加了侦听器(这里是构造器),那么事件是会有响应的,不必再添加侦听器
- 如果子类B中没有init,那么将执行父类的init回调函数(callback Handler)
- 如果子类B中有init,那么有两种可能:一种是把A、B两个类的init全部写为private的,与上面一样,B的init不会被事件触发。不过,这种需求很少遇到
- 我们经常遇到的需求是,需要B执行回调函数,但有一些特定的功能。就如同我们常用的override一样,因此,我们把A、B的init都定为protected的;注意,B的init前面要加修饰符override
- 然后,在B的init里面,用super.init()调用父类的init函数,剩下的部分写入B需要的逻辑即可。
No comments yet.