现在,在ActionScript 3.0的修饰符中,只有final修饰符没有介绍。之所有放在这里介绍,是因为final修饰符只与继承有关,指定一个方法不能被重写或一个类不能被继承。
一般来说,当用final修饰符修饰父类的方法时,子类不能重写此方法;当用final修饰符修饰类时,此类讲不能被继承。
提示:ActionScript 3.0中的final修饰符与Jave中的不同,在Java中,final修饰符经常用来定义变量,即字符串、数字等常量一般都会用 public static final 修饰,而在ActionScript 3.0中,常量一般由public static 修饰,而也就是说final修饰符不能修饰变量或常量,只能修饰方法和类。
final方法和类效率更高
final不能用于修饰构造方法。
使用final修饰方法一般出于这样的目的:当类中某个方法所提供的功能已经能满足需求,即无需要再进行修改或扩展,子类可以继承这样的方法但不能重新或覆盖次方法。
class Person{
public function Person{
}
public final function finalFun ():void{
trace("this is a final function");
}
}
class Teacher extends Person{
public function Teacher{
}
//错误,final方法不能被重写
pubic overrid function finalFun():void{
}
}
因此,用final修饰的方法可以防止该方法在子类中被重写。
同样,如果某个类设计得非常完美,并不需要修改或扩展时,此类就可以用final 修饰。例如,顶级类中的Math类用public final 修饰,flash.display包中的Graphics类也用public final 修饰。
Math类的部分伪代码如下:
package{
public final class Math{
public static const PI:Number= 3.141592653589793
public static function cos(angleRadians:Number):Number{
}
}
}
看到这里,读者可能有些意外,Math类的cos()方法为什么不用fina修饰呢?这是因为Math类已经是final修饰的了,Math类所有方法自然而然地也就是final了,换句话说,再用final修饰cos()方法纯属画蛇添足。
如果用户不小心继承了final修饰的类,Flash讲提示“基类是fina类”的错误。
package{
public class Test extends Mah{
}
}
因此,ongoingfinal修饰类能阻止此类继承。
用final修饰类后,此类就不能被继承,但并不等于不能扩展类的功能。因为类和类的关系有很多,继承只是其中一种关系,不能使用继承可以用聚合等其他的关系。(转)