当我扩展Sprite时,我总是不调用super()。
但是not calling super()
不会引起任何问题吗?
到目前为止,我没有遇到任何问题,我从未见过在构造函数中调用super()的代码,该类扩展了Sprite。
TextField呢?
我对TextField也没有任何问题。
如何知道是否应该调用super() ?
如果flash在你的子构造函数中没有检测到super()
的调用,那么flash将在子构造函数之前隐式地调用super()
。所以:
public class Parent {
public function Parent() {
trace("Parent");
}
}
public class Child extends Parent {
public function Child() {
trace("Child");
}
}
new Child();
// Parent
// Child
那么你的子构造函数就是这样的
public function Child() {
super(); // <-- Added by flash!
trace("Child");
}
所以,不,省略对super()
的显式调用不会通常对您孩子的班级产生不利影响。
为什么要显式调用super()
呢?
super
的无参数调用,这意味着如果你的父类构造函数需要参数,那么你需要用这些参数显式地调用它。如果在这种情况下省略super(args...)
调用,您将得到一个编译器错误。
第二,如果父类也有无参数构造函数,可以使用super()
来控制构造函数执行的顺序。Flash总是在子构造函数之前插入调用。如果你想改变顺序。
public class Child extends Parent {
public function Child() {
trace("Child");
super()
}
}
将以相反的顺序执行。或者你可以这样写:
public class Child extends Parent {
public function Child() {
// work before initilizing parent
super()
// work after initilizing parent
}
}
最后,有一种非常晦涩的方法可以让不调用父类构造函数:
public class Child extends Parent {
public function Child() {
if(false) super()
}
}
因为flash看到有调用,所以它没有插入一个。然而,因为它在if (false)
后面,所以它永远不会被调用,所以父类永远不会被初始化。
如果你没有显式地调用super()
, Flash会在构造函数中所有其他代码之前自动执行。
如果你显式调用super()
,它将在你写它的那一行被调用。
但是,请注意,在超类实例化之前,您不能设置或获取任何this
或super
属性或调用任何方法
可以安全地排除对基构造函数的调用。如果不在构造函数中调用super()
,编译器将添加一个不带参数的对基构造函数的调用。