[AS3]as3的对父类的调用super和super()用法示例
super和super() 的用法
在Flash AS3 中super和super()不是必须的用法。但它确实存在,尤其是从as2升级到as3,很多人对super和super()还抛不下。旧习难改!
应该说它们都是对父类的调用(你也可以叫做重载、调度、引用……中国的同义词太多)。
你看,super()是函数形式的写法,它调用的就是父类。
super则是一个方法,它调用的是父类中的方法,使用Dot(.)符号:super.makeMap()。这句代码就调用了父类中制作游戏地图的方法makeMap()。
在官方的帮助中有这样的陈述:
“调用方法或构造函数的超类或父版本。
在类构造函数体内使用super()语句时,该语句将调用构造函数的超类版本。对超类构造函数的调用必须有正确的参数数目。
请注意,不管是否显式调用超类函数,都会调用到超类构造函数。如果不是显式调用它,则将在子类构造函数体中的第一个语句前自动插入不带参数的调用。
这意味着,如果在子类中定义了构造函数,并且超类构造函数具有一个或多个参数,则必须显式调用具有正确参数数目的超类构造函数,否则将产生错误。
然而,根据ActionScript 2.0的要求,对超类构造函数的调用无需是子类构造函数中的第一个语句。
在实例方法体中使用时,super可以与dot (.)运算符共同使用以调用方法的超类版本,并可以选择将参数(arg1 ... argN)传递给超类方法。这对于创建某些子类方法很有用,这些子类方法在向超类方法添加附加行为的同时,又调用这些超类方法执行其原始行为。
在静态方法中不能使用super语句。”
我想,官方帮助中这些话说得清清楚楚,但是,由于我们的阅历、知识和理解能力的差异,未必每个人都能理解得透透彻彻。那么,我们还是老习惯,通过实例来消化它。
示例:
为方便,我们用包外类的方式来演示。
Lir包与LirMovieClip类:
packageLir{
import flash.display.Sprite;
public classLirMovieClipextends Sprite {
public functionLirMovieClip():void {
var the:addImg=new addImg();//实验1
//现在就应该执行the.LirBasic()
//输出:LirBasic
the.makeMap()//实验2
//输出内容应该是重写后的内容:addImg
//而不是makeMap
the.tests()//实验3
//因为重写了其它,看一下 没有被重写的方法 会不会受到影响。
//结果是不会受到影响。输出果然是:tests
//这就说明:在as3中,你可以完全无视super和super()!!
}
}
}
包外类LirBasic:
class LirBasic{;
public function LirBasic():void {
trace("LirBasic");
}
public function makeMap():void {
trace("makeMap");
}
public function tests():void {
trace("test");
}
}
又一个包类,用于演示子类对父类的继承。
class addImg extends LirBasic{;
public function addImg():void {
//super();//调用构造类.//这里我们不调用super()函数,试下效果。
//继承了LirBasic类.那么不使用super().实际上也会调用父类的构造方法.
//构造方法中如果有需要执行的代码,则会调用它们以执行.
//如果程序中的方法,子类重写了,则执行重写的方法.
}
override public function makeMap():void {//重写方法
trace("addImg");
//super.hello() 调用构造方法。我们依然不调用super方法。
}
//override不能用于重载变量(成员属性)。
//但是却可以用于重写getter和setter函数。
}
一点总结
1. super()是对父类的引用,super是对父类中方法、属性的调用。
2.可以无视二者的存在与否。因为子类在初始化时,一定会先执行父类的构造函数。这是不用我们操心的事,也是我们无法阻止的事。
3.如果父类有参数,super()必须带相应的参数。否则报错"未找到基类构造函数的默认参数"。
4.有人说:若重写子类,添加了一些功能,则要用到super,再次调用父类方法,使其保留,否则重写就把父类的方法都删掉了。但上面的实验已经证明,可以不必麻烦super大驾光临。
我的结论是:在as3中,子类中用不用super和super(),都会自动调用父类。所以,用不用悉尊个人之便!
张志晨
热门文章推荐
- [HLS]做自己的m3u8点播系统使用HTTP Live Streaming(HLS技术)
- [FMS]FMS流媒体服务器配置与使用相关的介绍
- [AS3]什么是M3U8,与HTML5的区别是什么
- AS2.0 让flash自适应全屏,并且不自动缩放
- [AS3]as3.0的sound类常用技巧整理
- [AS3]as3与ByteArray详解、ByteArray介绍、ByteArray用法
- 关于RTMP,RTMPT,RTMPS,RTMPE,RTMPTE协议的介绍
- [JS]分享浏览器弹出窗口不被拦截JS示例