每次我在Flash Builder中启动一个新的actionscript类时,都会使用一行
启动构造函数super()
我以前从未见过这个,似乎没有任何意义。删除它会产生完全相同的电影。
为什么它会插入到我的新课程中,它会做什么?
答案 0 :(得分:5)
super()
从您继承(扩展)的类中调用构造函数。
如果你的继承(基类)在它的构造函数中没有必需的参数,你可以将它们全部省略,flash会在构造函数代码之前自动调用它。
您可以使用super关键字从基类调用其他函数(公共的或受保护的):
super.myBaseClassMethod(); //would call the method 'myBaseClassMethod' from your base class even if you had an overriden method with in this class
示例:
package {
public class BaseClass {
public function BaseClass(){
trace("Base Class Constructed");
}
public function someBaseMethod():void {
trace("some method called from base");
}
}
}
package {
public class MyClass extends BaseClass { //this class is extending the class above
public function MyClass():void {
trace("My Class constructed");
super();
someBaseMethod();
super.someBaseMethod();
}
override public function someBaseMethod():void {
trace("Override");
}
}
}
所以,如果你这样做:
var tmp:MyClass = new MyClass();
你会得到:
"My Class constructed"
"Base Class Constructed"
"override"
"some method called from base"
如果省略super(),则为:
"Base Class Constructed"
"My Class constructed"
"override"
"some method called from base"
答案 1 :(得分:2)
作为inheritance的一部分,super调用方法或构造函数的超类或父版本。
调用方法或构造函数的超类或父版本。 在类构造函数的主体内使用时,super() statement调用构造函数的超类版本。电话 到超类构造函数必须具有正确的数量 参数。请注意,始终调用超类构造函数, 你是否明确地称之为。如果你没有明确打电话 它,在没有参数的调用之前会自动插入 子类构造函数体中的第一个语句。这意味着如果 您在子类和超类中定义构造函数 构造函数接受一个或多个参数,必须显式调用 具有正确数量的参数的超类构造函数或 会发生错误。但是,对超类构造函数的调用, 不需要是子类构造函数中的第一个语句, 正如ActionScript 2.0中所要求的那样。
当在实例方法的主体中使用时,super可以与。一起使用 点(。)运算符,用于调用方法的超类版本 可以选择将参数(arg1 ... argN)传递给超类 方法。这对于创建不仅添加的子类方法很有用 超类方法的附加行为,但也调用 超类方法来执行它们的原始行为。
您不能在静态方法中使用super语句。
在ActionScript中,类可以扩展未标记为final
的其他基类。
例如,MovieClip
继承如下:
Sprite> DisplayObjectContainer> InteractiveObject> DisplayObject> EventDispatcher>对象
通过调用super()
,可以控制何时调用父构造函数。
package
{
import flash.display.MovieClip;
public class ExampleMovieClip extends MovieClip
{
public function ExampleMovieClip()
{
super(); // MovieClip's constructor is called
}
}
}