当class在actionscript3中扩展Sprite时,我不必在构造函数中调用super()吗?

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)永远不会被调用,所以父类永远不会被初始化.

  • http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f30.html - 在**构造方法**部分下 (4认同)