⑴类就是实例(对象是类的实例)中所有共同的特征(属性)和行为(方法)所组成的,类是一个独立的外部脚本文件(一个类文件只能编写一个类)而不是编写在FLASH文档中(类文件的扩展名是 .as) 。创建类的一个实例就被称为实例化一个对象同时要记住"三者一致"①类文件的文件名②类名③类的构造器函数的函数名.
⑵类中所有的对象都拥有相同的属性(属性是与对象相关的变量)但是各个对象的属性值都是不一样的,
方法是与对象相关的函数,它是在特定对象上执行的动作或过程,方法识别对象及其多包含的所有属性,从维护性和安全性角度考虑,属性只能通过方法来访问,这可以防止在类外部修改他们
类创建新对象的通常做法是使用关键字new,例: var instancename : Classtype=new Classtype(); 这段代码创建了 Classtype类的一个实例 instancename.
⑶创建一个类:一个类的基本声明必须具备①以一个class语句开头,后面跟有类名。②类名后是一对大括号,大括号的所有内容都称做是类体(我们就是在类体中定义属性和方法)。
例如:class Egg {
//定义两个属性 color 和 weight
var color :string ;
var weight :Number ;
//定义了一个方法 hatch ( )
function hrath ( where ) {
}
class Egg {
}
⑷ 成员:就是类中的属性和方法, 分为①实例成员(会被创建和复制到从类中创建的每一个实例中)②类成员(每一个类仅创建一次,因此也被称为静态成员);由于“类成员”只被分配给类本身,而不会分配给类的任何实例,所以要调用“类成员”就必须直接引用类名本身,例: Math . PI
要把类的某些或全部属性和方法定义成类成员,就要使用关键字 static 例:static var point : number 就是定义了一个名为 point 的静态属性(类属性); 例:static function drawLine ( ) { // 某些代码 } 则是定义了一个名为 drawLine 的静态方法(类方法);注意:静态方法只能访问静态属性而不能访问实例属性,而静态属性的名称通常全部使用大写字母,例 class NoWay {
// instancePro 被定义为实例属性
var instancePro ;
// 而 power ( ) 被定义为静态方法
static function power ( ) {
return instancePro .instancePro;
}
}
这个脚本就会导致编译器出错.
我们可以创建出一个即包含类成员有包含实例成员的类,而不必把所有的成员都搞成类成员或实例成员.(一个成员应该被定义成类成员还是实例成员是根据实际情况而定的,如果一个成员要反映实例的个体特性,就应该定义为实例成员;若一个成员对所有实例都一样,那就该被定义为类成员.)
类的成员除了有类成员和实例成员之分外,还分为①公共成员(是可以被外界即类的外部访问的的成员)②私有成员(只能在类和该类的子类的内部访问的成员);要把类的成员定义为公共成员可使用关键字public,要定义位私有成员可使用关键字private.
决定一个类是公共的还是私有的要掌握:从类生成的对象上调用成员,就将该成员定义为公共的;只在类体中使用的成员就应被定义为私有的. 例: class Egg {
/ / 定义了两个属性 color 和 weight
var color : string ;
var weight : Number ;
private var depth : Number ;
/ / 定义了一个方法 hatch ( )
function hatch ( where ) {
depth = where.getNextHighestDepth ( ) ;
}
/ / 定义了构造器函数 Egg
function Egg ( eggColor : string ,eggWeight : Number ) {
color = eggColor ;
weight = eggWeight ;
}
}
因为 Egg 类中 hatch ( ) 方法中定义的变量 depth 的作用是保存当前影片剪辑中下一个可用深度,他不需要作为属性被用户访问到,所以把它 ( depth ) 由局域变量改为一个私有成员是合适的。但在这段代码中,private 关键字在中文版中是不起作用的,即使它已把成员定为私有,仍能在势力级别上访问它,但在英文版中就没有这个bug 了。
⑸类的继承概念:假若现在有两个类 A 和 B ;若 B 类继承 A 类,则 A 就是 B 超类,B 就是 A 的子类。子类除了具有超类的所有属性和方法外还具有超类没有的专属自己的属性 。类可以除了在ActionScrip 2.0 中不能进行多继承(就是一个类同时继承多个类的属性和方法),即一个类只能继承一个类,而不能同时继承自两个或多个类,在例如JAVA。。。等 都是可以的。
在定义类的类声明中使用关键字 extens 来指明你选择的类所要继承类的类名;例:Class SubClass extends Square {
{
SubClass 就是要定义的类,SuperClass 就是SubClass 要继承的类。继承的类和被继承的类的最基本的区别就是继承的类拥有被继承类的所有属性和方法但同时又具有被继承类所没有的属性和方法。
例:Class SquareAndCircle extends Square {
/ / 定义了一个静态方法 drawCircle ( )
static function drawCircle ( x : Number , y : Number , r : Number , where : string ) {
with ( where ) {
/ / 一段画圆的代码
}
}
function SquareAndCircle ( ) { }
}
这个例子中定义了一个 SquareAndCircle 类;让该类继承了 Square 类,在 SquareAndCircle 类继承Square 类的所有属性和方法时,又定义了一个 Square 类所没有的方法 drawCircle ( ) ;这样 SquareAndCircle 类就不仅能用自己方法画圆;还能用超类 ( Square 类 ) 的方法画方了。
要是在测试的时候,出现只能调用 SquareAndCircle 类自己的方法 drawCircle ( ) ;而不能调用 Square 类的方法 drawSquare ( ) ;这是因为 drawSquare ( ) 方法在 Square 类中被定义为静态的了(静态方法是不被继承的),所以只要把 Square 类中的 drawSquare ( ) 方法前的关键字 static 去掉就行。
用类继承的方法来扩展内建类的能力;我们可以定义一个子类来继承想要的内建类的属性和方法;
例:class SubSound extends sound {
var name;
function SubSound ( ) { }
}
这段代码中定义了一个 SubSound 类,它继承了 Sound 类,而我们又给 SubSound 类增加了一个新属性 name 来保存歌曲的名字。
如何来扩展 MovieClip 类的能力;由于 MovieClip 类生成的是影片剪辑元件,而影片剪辑元件是用菜单创建的(菜单创建的影片剪辑元件是继承 MovieClip 类的一个子类),因此就不能用 new 运算符,也就不用考虑以上面例子中的方法来使用子类;现在就的改变影片剪辑元件所继承的类: 例:
①创建一个 SubMC 的类继承 MovieClip 类,SubMC.ac 中的代码为:
class SubMC extends MovieClip {
var author : spring ;
function SubMC ( ) { }
}
在次 author 属性,是保存制作该影片剪辑元件的作者的名字的;
②打开FLASH文档,创建一个影片剪辑元件,在该元件的属性链接中选种为动作脚本导出,并在AS2.0 类文本框中输入创建的子类的类名(SubMC);现在影片剪辑元件就由继承 MovieClip 类;改为继承 新定义的 SubMC 类了,以后在FLASH中就可以使用该影片剪辑了,而且创建出的所有实例都有多一个 author 属性。
⑹接口是只声明了方法但没给方法定义也没有任何其他东西的类,而接口中的方法是在实现该接口的类中被定义的;单独的接口是没有用,他需要通过创建类来实现它。
接口文件是一个独立的外部文件,扩展名是:.as;因为接口没有构造器函数,所以创建接口时只需要将接口文件的文件名和接口名保持一直就行,要注意一个接口文件只能编写一个接口;
例:创建一个 Drive 接口,再创建两个类 Car 和 Bus 来实现接口:
①新建一个动作脚本,输入:
interface Drive {
function startEngline ( ) : Void ;
function clutch ( ) : AVoid ;
function addGasoline ( amount : Number ) :Number ;
}
这段脚本创建了 Drive 接口,要创建接口的基本形式为:以关键字 interface 开头,后面跟接口名,然后是跟大括号{},大括号里的内容就是接口要声明的方法; 例如下面这段代码:
interface Drive {
/ / 接口的方法
}
接口只能声明方法而不能声明属性,如上面的例子中 Drive 接口声明了 startEngline ( ) , clutch ( ) , addGasoline ( ) 三个方法;把这个借口文件保存为:Drive.as ;
②新建一个动作脚本文件,输入:
class car inplements Drive {
var speed : Number ;
funcition startEngine ( ) : Void {
/ / 定义接口中的方法
}
function clutch ( ) : Void {
/ / 定义接口中方法
}
function addGasoline (amount : Number ) : Number {
/ / 定义接口中的方法
return speed ;
}
function Car ( ) { }
}
定义一个类要使它实现哪个接口,用关键字 inplements 后面跟类要实现的接口的名称,格式如下:
class Car inplements Drive {
}
一个类要想实现某个接口,就必须对该接口的所有方法进行定义,缺少一个都是错误的,如上例中:Car 类定义了接口的所有方法,而且还具有接口所不具备的属性和方法,上例中 Car 类就具有 Drive 接口所不具有的属性: function Car ( ) { };
新建一个动作脚本,输入:
class Bus implements Drive {
var speed : Number ;
var amounLimit : Number ;
function startEngine ( ) : Void {
/ / 定义接口的方法
}
function clutch ( ) : Void {
/ / 定义接口的方法
}
function addGasoline ( amount : Number ) : Number {
/ / 定义接口的方法
return speed ;
}
function Bus ( ) { }
}
上面的动作脚本制作了一个 Bus 类,把这个类文件以文件名 Bus.as 保存到与 Drive.as 和 Car.as 相同的文件夹里;
要保存类 Bus 和 Car 类型的数据,而且程序符合严格数据类型指定这一规范,就可以借助接口 Drive 实现:
/ / myBus 的数据类型为 Bus
var myBus : bus = new Bus ( ) ;
/ / myCar 的数据类型为 Car
var myCar : Car = new Car ( ) ;
/ / myVehicle 的数据类型为 Drive
var myVehicle : Drive ;
/ / myVehicle 中即可以保存 Bus 类型也可以保存 Car 的类型
myVehicle = myBus ;
myVehicle = myCar ;
一个接口同时被被其它多个类所实现,则类的数据类型都是属于各自的类,又属于这个接口,因此上述代码可以改成下面的方式:
var myBus : Drive = new Bus( ) ;
bar myCar : Drive = new Car ( ) ;
现在,myBus 和 myCar 都可以保存对方的数据类型,尽管它们属于不同的类;
⑺ 类被保存的位置就是类路径,添加新的类路径,就要把新的类路径告知编译器,选择编辑→首选参数命令选择动作脚本选项,再单击动作脚本2.0设置,在弹出的对话框中单击浏览到路径,再找到要改变的类后,单击确定就添加好一个新的类路径了;
利用改变类路径对类进行分类:①在类路径中创建一个文件夹用来保存类;②修改被分类的类的类声明,让被分类的类的相对路径在类声明中得到体现;③在开发程序时,要引用这些被分类了的类,首先要要引入这些类所在的包; 例:
假定现在有 Car 和 Bus 两个类,它们的类声明如下:
Car 类的类声明:
class Car {
/ / 类体
}
Bus 类的声明:
class Bus {
/ / 类体
}
要把两个类归类到一个名为 vehicle 的文件夹中,可以在其中任何一个类路径中创建一个名为 vehicle 的文件夹,然后把两个类文件移动到 vehicle 文件夹中;
再修改类的类声明,使之反映出由类路径到这些类被分类后的位置的相对路径,打开 Car.as 文件,把 Car 类的类声明改为:
class vehicle . Car {
/ / 类体
}
打开 Bus.as 文件,把 Bus 类的类声明改为:
class vehicle . Bus {
/ / 类体
}
在程序开发中,要调用这些被归类后的类前,先要引入这些被归类的的类所在的文件夹,引入它应使用用:import 关键字?(关键字 import 支持通配符),由于关键字 import 支持通配符这可以一次将文件夹里的类全部引入,所以在打开 myVehicle.fla ,在访问类之前,要使用下面的脚本引入 vehicle 文件夹中所有的类:
import vehicle .* ;
( 接口的用途,类似于类的继承)