ActionScript 2.0--动态类VS静态类
**************************************
动态类允许动态的对类进行扩展(例如允许加入新的属性或方法)。象Jscript.NET程序中这种方式称为expando,如果类不是动态类 (象Math类)用户不能加入新的属性和方法。而在as1中这其实是很平常的事。就象下面这样为MOVIECLIP加入新的属性和方法:
movieClip.protoType.someNewMethed=function(){ 一些方法; }
在as2中这种扩展方式是不允许的。然而我可能通过创建子类的方式加入新的属性和方法。
下面的例子是我们要扩展静态类Math中的Max()方法.我们要新将其扩展为在一些数中求出最大的数而不是原先那样只限定在两个数中求出最大的数。
dynamic class Math2 extends Math { // store a reference to Math.max() private static var oMax:Function = Math.max; // static class cannot be instantiated private function Math2() {} // override Math.max(), support any number of arguments public static function max():Number { var a:Array = arguments; var n:Number = a.length; if (n > 2) { var m:Number = oMax(a[n-2],a[n-1]); // remove two elements from the end of the array; // could use 'a.length -= 2' as a shortcut as well a.pop(); a.pop(); a.push(m); return Number(max.apply(null, a)); } else if (n == 2) { return oMax(a[0],a[1]); } else if (n == 1) { return a[0]; } else { return oMax(); } } }
不象原有的类那样,现在我们已经对其MAX()方法进行了扩展将其变成了动态类。并且形成了新的类名为math2.
现在可以试一下了。
trace(Math2.max(70,6,3,12,82,9,28,5));
ActionScript 2.0--继承
***************************************
正如前面提到过的。继承对于OOP编程是很重要的尽管它不是绝对的需要。它用来定义子类与超类之间的关系。AS2为实现这一目的设置了一个新的关键词:extends.在上一例中的Math2中我们已经使用的了extends这一关键字继承Math类。它还是比较简单的。
在构造函数时首先应注意的是super()关建字。它的作用是调用超类的构造函数,如果你之前没有在超类中构造函数那么FLASH会自动生成一个空的构造函数。
值得欣慰的是许多BUG在新版的flash player7中已经被修复。但在FLASHPLAY6仍有bug的问题,如果你不太清楚,可能查看AS1中有关继承bug的相关列表文章。
如果你想要从子类传递参数给你的超类,你应确保在你的超类中已有了这些参数的声明。否则你会发现为什么只有部分的参数被传递。如我们要创建一个子类名为Child,它继承自他的父类。我们应在构造函数中这样写:
class Child extends Parent { private var fName:String = ""; public function Child(lname:String, fname:String) { super(lname); // continue Child's constructor code fName = fname; } }
ActionScript 2.0--导入外部的类文件
*************************************
为了更好的组织类和避免类名称的冲突.被许多语言应用的概念包被引入.ActionScript 2.0引入包就是为了解决这个问题.
类名称的冲突是指什么呢?我们假想有两个开发人员,每个人都建立了一个代码库.在库中都有一个名为utility的类.如果这两个代码库合在一起使用,这时就会造成flash的混乱,不知使用哪一个库中的类.
这时类路径及来出来挽救,通过将路径合并到类名称中.就象是硬盘中的文件一样,在不同的目录中可以有相同的文件存在.要指明引用哪一个类.要在导入过程中使用正确的类路径.如:
import mx.events.Eventdesign;
一旦类被导入,我们在引用类时就可能只接使用类名称而不需要使用类的路径了.
class MyBroadcaster { public function MyBroadcaster() { EventDesign.initialize(this); } }
当然,你也可以不用导入的方式,而是在每次使用时都指明类的正确路径.可这样做会使人很烦的.当多次使用时要不断的输入重复的东西.
class MyBroadcaster { public function MyBroadcaster() { mx.events.EventDesign.initialize(this); } }
当在创建自已的类时,将你的类放在一个指定的项目目录中,或是放在一个公共的类库中,而不要将其放在
<Flash install folder><language>First RunClasses) 或<drive>:Documents and Settings<user>Local SettingsApplication DataMacromediaFlash MX 2004<language>ConfigurationClasses).
这样做可以使执行同步同时减少编译时错误的出现.一种公用的方法是使用你的反面的域名作为类的路径如
import com.quantumwave.alliance.rebel.Commander;
如果要导入路径中的所有类.使用通配符*,如下:
import com.quantumwave.*
这一步导入将导入com.quantumwave下的所有的类但在编译时只编译使用到的类,所以你不必担心导入所有的类会增大你文件的大小.
ActionScript 2.0--接口
************************************
当在使用OOP时,除了继承比较重要之外,在就是接口了.就像JAVA和C#,ActionScript不提供多重继承(如一个子类可继承多个超 类),这是因为如果使用不当在调试时就会象做了一场恶梦一样.会造成死循环和粘连不清的情况,在精心设计你的项目时,使用接口可以同样达到多重继承的效 果,而不会出现上面说的那种很麻烦的情况.
一个接口就象是各类在执行方法时的一种协议,而通常在各个类未执行方法时是没有联系的.在接口中没有代码没有属性,只有方法,它的书写方式完全就象是在书写一个类一样,除了:
1.它们都没有属性
2.它们只有方法的标记,参数,类型和返回的类型
3.在方法定义的结尾只有小括号而没有大括号
下面是一个可拖动的类名为Dragable的范例(通常在命名接口时通常以大写的"I"开头).
interface IDraggable { public function startDrag():Void; public function stopDrag():Void; public function isDragging():Boolean; }
如果要使用Interface需要使用关键字implement.如下面的例子,child类继承超类同时使用接口IDraggable.
class Child extends Parent implements IDraggable { public function Child() { // add Child constructor code } public function startDrag():Void { // implement the code for startDrag(); } public function stopDrag():Void { // implement the code for stopDrag(); } public function isDragging():Boolean { // implement the code for isDragging(); } }
唯一在使用接口时注意的事情是,在类中应使用与接口中一样的方法,参数类型的定义,通过这种方式接口可以在两个不一样的程序员之间标准化代码,当一个已知的接口被类使用时,和序员只需知道接口以在不同的类中使用.
完