AS3中super的用法[转从A闪]

AS3中super的用法[转自A闪]

super它到底是什么?这是我第一个问题,在帮助中石这样说明的“调用方法或构造函数的超类或父版本。在类构造函数体内使用 super() 语句时,该语句将调用构造函数的超类版本。对超类构造函数的调用必须有正确的参数数目。请注意,不管是否显式调用超类函数,都会调用到超类构造函数。如果不是显式调用它,则将在子类构造函数体中的第一个语句前自动插入不带参数的调用。这意味着,如果在子类中定义了构造函数,并且超类构造函数具有一个或多个参数,则必须显式调用具有正确参数数目的超类构造函数,否则将产生错误。然而,根据 ActionScript 2.0 的要求,对超类构造函数的调用无需是子类构造函数中的第一个语句。”说了半天也是含糊其辞,我个人的理解就是super实际上是一个超类或父类的引用。我们可以把super看做是父类的一个实例。这样就好理解多了。但实际上它并非是父类的一个实例,我这样说只是方便理解。那么我们可以怎么去使用它呢?在帮助文档中提到了两种使用方法:

super([arg1, ..., argN])
super.method([arg1, ..., argN])

先来说说第二种,因为第二种比较好理解。我写了一个例子,大家来看一下就明白了!
package 
{
/**
* ...
* @author A闪
*/
public class Flei
{

public function Flei()
{

}
public function shu():void
{
trace("a");
}

}

}

package 
{
/**
* ...
* @author A闪
*/
public class Zlei extends Flei
{

public function Zlei()
{

}
public override function shu():void
{
super.shu();
trace("b");
}

}

}

package
{
import flash.display.Sprite;
import flash.events.Event;

/**
* ...
* @author A闪
*/
public class Main extends Sprite
{

public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}

private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
var a:Zlei = new Zlei();
a.shu();
}

}

}
运行这个程序,我们会看到输出ab。但是为什么会输出这个结果呢?实际上就是因为我们使用了super语句。再上面这个范例中,我们重写了了shu方法。如果重写的话,父类中的所有语句就等于被删除了!但是假如我们只希望在原来的功能上添加一些功能,怎么办呢?使用super,这样再调用一次父类的shu方法,原来的语句就被执行一次,相当于将原来的语句保留了。在此基础之上我们在添加一个新的语句。本例中就是trace("b");这个super的一种使用方法。
我们再来看另外一种使用方法。super()这个语句可以看做是父类的构造函数。什么意思呢?我们来简单的解释一下,一个父类,如果其构造函数不需要参数,那么好了!我们可以像上面那个例子中一样去使用。但是大家注意,在程序运行的时候,子类实际上是先执行一次父类的构造函数的。这个过程中,程序会自动的在子类的构造器函数中添加一个调用的语句。我们可以把它称为隐式调用。好了!现在我们将程序稍微修改一下,在Flei类文件的构造器函数中添加一个参数,代码如下:
package 
{
/**
* ...
* @author A闪
*/
public class Flei
{

public function Flei(wen:String)
{

}
public function shu():void
{
trace("a");
}

}

}
我们可以看到,父类现在在初始化的时候需要一个参数,但是在子类中使用的是隐式调用,那么程序不会像父类的构造函数中传递任何参数,此时运行程序就会报错。怎么办呢?使用super(),这个语句就是调用一次父类的构造函数,写上这个语句和不写这个语句是一样的,写上了就是显示调用。那么写上之后有什么好处呢?好处就是我们可以为父类的构造函数添加参数了~!这样就可以解决上面的错误。
看一下实例!!我们只更改子类文件:
package 
{
/**
* ...
* @author A闪
*/
public class Zlei extends Flei
{

public function Zlei()
{
super("A闪");
}
public override function shu():void
{
super.shu();
trace("b");
}

}

}
这样修改之后,大家再来运行一下影片,呵呵@!不报错了吧!super的使用就这两个,明白了就非常简单,不明白,就费劲了!不知道说的明不明白。大家有不明白的地方给我留言,我会一一解答的!~
最后总结一下,当父类的构造函数中需要参数,则在子类中构造函数中可能会出现super(参数...),这时候我们叫做显示调用。当父类的构造函数中没有参数的时候,可以不写super(),这个时候叫做隐式调用。另外,子类初始化的时候一定会先调用父类的构造函数(必须的)。
第二种用法就是把super当做一个变量,当做父类的应用,通过super.方法()或者super.属性,可以访问父类中的方法和属性。