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



当我扩展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()呢?

第一个原因是flash只会自动生成对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(),它将在你写它的那一行被调用。

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

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

最新更新