2016-10-13 00:16:48 点击量:51 标签: 收藏本文
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(),都会自动调用父类。所以,用不用悉尊个人之便!
张志晨
我们是一家提供综合软件外包与弱电工程服务的技术公司。
业务涵盖定制软件、管理系统、网站、小程序、APP、系统集成、网络布线、监控安防、门禁、机房建设及长期技术维护。
公司地址:湖北省宜昌市伍家岗区东站二路6号三峡(宜昌)大数据产业园海洋馆二楼A203室