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

时间:2011-09-24 11:27:12

标签: actionscript-3 inheritance sprite super

当我扩展Sprite时,我总是不调用super() 但not calling super()不会导致任何问题吗?
直到现在,我没有任何问题,我从未见过在构造函数中调用super()的代码,该类扩展了Sprite。

TextField怎么样?
我对TextField也没有任何问题。

如何知道我是否应该调用super()?

3 个答案:

答案 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(),则会在您编写它的行上调用它。

但是,请注意,在实例化超类之前,您无法设置或获取任何thissuper属性或调用任何方法

答案 2 :(得分:1)

您可以安全地排除对基础构造函数的调用。如果你没有在构造函数中调用super(),编译器将添加一个没有参数的基础构造函数的调用。