·您当前的位置:首页 > 技术教程 > AS2与AS3技术 >

[AS3]as3的对父类的调用super和super()用法示例

时间:2013-03-19 00:58baidu.com
[AS3]as3的对父类的调用super和super()用法示例,在Flash AS3 中super和super()不是必须的用法。但它确实存在,尤其是从as2升级到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(),都会自动调用父类。所以,用不用悉尊个人之便!
张志晨

热门文章推荐

请稍候...

保利威视云平台-轻松实现点播直播视频应用

酷播云数据统计分析跨平台播放器