js_*_*js_ 5 inheritance sprite super actionscript-3
当我扩展Sprite时,我总是不调用super().
但是不会not calling super()造成任何问题吗?
直到现在,我没有任何问题,我从未见过在构造函数中调用super()的代码,该类扩展了Sprite.
TextField怎么样?
我对TextField也没有任何问题.
如何知道我是否应该调用super()?
J. *_*mes 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
Run Code Online (Sandbox Code Playgroud)
所以你的子构造函数基本上就是这样的
public function Child() {
super(); // <-- Added by flash!
trace("Child");
}
Run Code Online (Sandbox Code Playgroud)
所以,不,省略明确的电话通常super()不会对孩子的课程产生不利影响.
那你为什么要明确地打电话super()?
第一个原因是flash只会自动生成无参数调用super,这意味着如果你的父类构造函数需要参数,那么你需要用这些参数显式调用它.如果super(args...)在这种情况下省略了调用,则会出现编译器错误.
其次,即使您的父级具有无参数构造函数,您也可以使用它super()来控制构造函数执行的顺序.Flash将始终在childs构造函数之前插入调用.所以如果你想改变那个顺序.然后
public class Child extends Parent {
public function Child() {
trace("Child");
super()
}
}
Run Code Online (Sandbox Code Playgroud)
会以相反的顺序做到这一点.或者你可以这样做:
public class Child extends Parent {
public function Child() {
// work before initilizing parent
super()
// work after initilizing parent
}
}
Run Code Online (Sandbox Code Playgroud)
最后,有一种非常模糊的方法是不要打电话给你的父母建设者说:
public class Child extends Parent {
public function Child() {
if(false) super()
}
}
Run Code Online (Sandbox Code Playgroud)
因为flash看到有一个调用,所以它不会插入一个.但是因为它背后的一个if (false)永远不会被调用,所以父类永远不会被初始化.