本文主要是介绍Super用法深透理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
学习AS3以来,Super用法一直有点搞不清,帮助文档里说的也是含糊不清。。
我们看下官方帮助先:“调用方法或构造函数的超类或父版本。在类构造函数体内使用 super() 语句时,该语句将调用构造函数的超类版本。对超类构造函数的调用必须有正确的参数数目。请注意,不管是否显式调用超类函数,都会调用到超类构造函数。如果不是显式调用它,则将在子类构造函数体中的第一个语句前自动插入不带参数的调用。这意味着,如果在子类中定义了构造函数,并且超类构造函数具有一个或多个参数,则必须显式调用具有正确参数数目的超类构造函数,否则将产生错误。然而,根据 ActionScript 2.0 的要求,对超类构造函数的调用无需是子类构造函数中的第一个语句。 在实例方法体中使用时,super 可以与 dot (.) 运算符共同使用以调用方法的超类版本,并可以选择将参数 (arg1 … argN) 传递给超类方法。这对于创建某些子类方法很有用,这些子类方法在向超类方法添加附加行为的同时,又调用这些超类方法执行其原始行为。 在静态方法中不能使用 super 语句。”
—-说的还真不太清楚啊….
自己又查了一些资料,尝试了一下,终于弄清楚了,分享如下:
super有两种用法:
super([arg1, ..., argN]) 和 super.method([arg1, ..., argN])
第一种 super([arg1, ..., argN]):(看下面例子)
//父类
package
{ import flash.display.Sprite; /** * ...* @author nickro */ public class SuperExample extends Sprite{ public function SuperExample() {trace("Super_z")}}
}
//子类
package
{ /** * ... * @author nickro */ public class SubSuper extends SuperExample { public function SubSuper() { super(); }}
}
//主类
package
{ import flash.display.Sprite; /** * ... * @author nickro */ public class Main extends Sprite { public function Main():void { var _example:SubSuper = new SubSuper(); } }
}
运行,输出结果Super_z,为什么会是这个结果呢?这是由于子类中‘显式调用’了super()的作用,子类初始化的时候一定会执行一次父类的构造函数;
但子类也可以不写super(),同样结果也会输出Super_z,这种叫‘隐式调用’;‘显式调用’和‘隐式调用’与别在于父类的构造函数是否有参数。
public function SuperExample(parm:String) {trace("Super_z")}
若父类有参数(如上),则子类SubSuper 中必须‘显式调用’:super(参数)———-注:显式调用需具有正确参数数目的超类构造函数,否则将产生错误
若父类无参,则可‘隐式调用’或‘显式调用’不带参数的super();
第二种:super.method([arg1, ..., argN])
我们来为父类添加一个方法 说明
//父类
package
{ import flash.display.Sprite; /** * ... * @author nickro */ public class SuperExample extends Sprite { public function SuperExample() { } public function sp_Func() { trace("Super_a") } }
}
子类用super调用该方法:
package
{ /** * ... * @author nickro */ public class SubSuper extends SuperExample { public function SubSuper() { super.sp_Func() } }
}
//主类
package
{ import flash.display.Sprite; /** * ... * @author nickro */ public class Main extends Sprite { public function Main():void { var _example:SubSuper = new SubSuper(); } }
}
运行,输出结果:Super_a
这种方法可以理解为super 当做一个变量,当做父类的引,通过super.方法() 或者 super.属性,可以访问父类中的方法和属性。大家可试试
super.method([arg1, ..., argN]) 带参数的方法和第一种带参的用法一致,不多说
总结一下注意点:
1. super为父类超类的引用,我们可以把super当作父类的一个实例(实际上并不是实例,这样便于理解)
2.子类在初始化时一定会先执行父类的构造函数,不管是显式还是隐式,这是必须的!
3.父类有参时,super必须要显式调用且参数正确;无参时可隐式调用或显式调用不带参的super();
4. 第二种理解为 super.方法()或者super.属性 调用
5. 若子类重写,需添加一些功能,则要用到super,再次调用父类方法,使其保留,否则重写就把父类的方法都删掉了。(看个人需求)
6.父类的构造函数带参,子类的构造函数可以不带参.但是父类如果为被直接调用则必须有默认参数,否则报错”未找到基类构造函数的默认参数”;
7.子类可以直接super(“nickro”)传给父类参数;
8.super关键字可以理解成父类的实例,比如父类有方法father();则可以直接super.father();调用父类方法,同时子类重写了father方法的话,也可以以此来分别获得子类和父类的father方法的调用;
这篇关于Super用法深透理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!