2

每次我在 Flash Builder 中启动一个新的 actionscript 类时,它都会从构造函数开始一行

super()

我以前从未见过这个,它似乎没有任何目的。删除它会产生完全相同的电影。

为什么将它插入我的新班级,它有什么作用?

4

2 回答 2

5

super()从您继承(扩展)的类中调用构造函数。

如果您继承的(基)类的构造函数中没有必需的参数,您可以将其全部省略,flash 将在您的构造函数代码之前自动调用它。

您可以使用 super 关键字从基类中调用其他函数(公共的或受保护的):

super.myBaseClassMethod(); //would call the method 'myBaseClassMethod' from your base class even if you had an overriden method with in this class

例子:

package {
    public class BaseClass {
        public function BaseClass(){
            trace("Base Class Constructed");
        }

        public function someBaseMethod():void {
            trace("some method called from base");
        }
    }

}

package {
    public class MyClass extends BaseClass {  //this class is extending the class above
        public function MyClass():void {
            trace("My Class constructed");

            super();
            someBaseMethod();
            super.someBaseMethod();
        }

        override public function someBaseMethod():void {
            trace("Override");
        }
    }
}

所以如果你这样做:

var tmp:MyClass = new MyClass();

你会得到:

"My Class constructed"
"Base Class Constructed"

"override"
"some method called from base"

如果省略 super(),它将是:

"Base Class Constructed"
"My Class constructed"

"override"
"some method called from base"
于 2013-05-17T18:50:49.577 回答
2

作为继承的一部分,super调用方法或构造函数的超类或父版本。

调用方法或构造函数的超类或父版本。当在类构造函数的主体中使用时,super() 语句调用构造函数的超类版本。对超类构造函数的调用必须具有正确数量的参数。请注意,始终调用超类构造函数,无论您是否显式调用它。如果您没有显式调用它,则在子类构造函数主体的第一条语句之前会自动插入不带参数的调用。这意味着如果你在子类中定义了一个构造函数,并且超类构造函数接受一个或多个参数,你必须显式调用具有正确数量参数的超类构造函数,否则会发生错误。然而,对超类构造函数的调用,

当在实例方法的主体中使用时,super 可以与点 (.) 运算符一起使用来调用方法的超类版本,并且可以选择将参数 (arg1 ... argN) 传递给超类方法。这对于创建子类方法很有用,这些方法不仅向超类方法添加额外的行为,而且还调用超类方法来执行它们的原始行为。

您不能在静态方法中使用 super 语句。

在 ActionScript 中,类可以扩展其他未标记为final.

例如MovieClip继承如下:

Sprite > DisplayObjectContainer > InteractiveObject > DisplayObject > EventDispatcher > Object

通过调用super(),您可以控制何时调用父构造函数。

package
{
    import flash.display.MovieClip;

    public class ExampleMovieClip extends MovieClip
    {
        public function ExampleMovieClip()
        {
            super(); // MovieClip's constructor is called
        }
    }
}
于 2013-05-17T18:49:38.760 回答