当我扩展Sprite时,我总是不调用super()
但not calling super()
不会导致任何问题吗?
直到现在,我没有任何问题,我从未见过在构造函数中调用super()的代码,该类扩展了Sprite。
TextField怎么样?
我对TextField也没有任何问题。
如何知道我是否应该调用super()?
答案 0 :(得分:30)
如果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()
?
第一个原因是flash只会自动生成对super
的无参数调用,这意味着如果你的父类构造函数需要参数,那么你需要用那些显式调用它参数。如果在这种情况下省略super(args...)
调用,则会出现编译器错误。
其次,即使您的父级具有无参数构造函数,也可以使用super()
来控制构造函数执行的顺序。 Flash将始终在childs构造函数之前插入调用。所以如果你想改变那个顺序。然后
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)
永远不会被调用,所以父类永远不会被初始化。
答案 1 :(得分:4)
如果您未明确致电super()
,Flash会自动 构建器中的所有其他代码。
如果您明确调用super()
,则会在您编写它的行上调用它。
但是,请注意,在实例化超类之前,您无法设置或获取任何this
或super
属性或调用任何方法
答案 2 :(得分:1)
您可以安全地排除对基础构造函数的调用。如果你没有在构造函数中调用super()
,编译器将添加一个没有参数的基础构造函数的调用。