您的位置:首页 > 职场人生

揭开AS程序的外纱(九) -- 手把手,编写自己的类

2010-08-29 19:27 309 查看
当你面对一个大型项目的时候,通常需要把具有相似功能的内容组织在一起。比如,你可能需要把和预加载相关的代码放在一个地方,把和框架搭建相关的代码放在另外一个地方。这对于以后的维护无疑是大有好处的。这时,你需要编写自己的类。

可以说,编写自己的类,是AS3.0编程语言,最重要的用法。下面,我会尽量以简单的方式,将如何用AS3.0编写自己的类的方法,介绍给大家。但我所讲的,只是最基础的用法。大家如果要深入了解类的知识,还需要参考更专业的书籍。

在下面的篇幅中,我们需要创建一个类,该类实现圆形的面积计算。

一、创建类

(1) 首先,我们需要创建一个文件夹,用来存放创建的类。但要注意的是,这个文件夹的命名不能使用Flash的关键字。比如as、class等作为文件夹名,都是不可以的。

假设我们创建的文件夹名字为area

(2) 我们需要新建一个as文件,as文件是Flash的标准类文件。这个as文件名最好能映射需要实现的功能,这样方便以后查找和修改。

假设我们的创建的as文件为circle.as

(3) 打开as文件后,我们就可以编写代码了。这里说句题外话,直接在Flash软件中,填写代码和测试是不太方便的,需要不停的切换界面和代码区域。我建议Fla文件用Flash软件,而as文件用其他工具完成,比如我习惯使用FlashDevelop这个软件。

打开circle.as,写入代码如下:

package area { //area:对应文件夹名称

public dynamic class circle { //circle:对应文件名称

}

}

在AS2.0中,文件地址通常直接用class完成,比如class area.circle{}。但是在AS3.0中,这种写法是不允许的,必须用paceage语句来指定文件夹地址。同时必须保证文件大小写一致。

在AS3.0中,可以用以下4个属性来定义类:

internal(默认):同一个包(文件夹)下的文件,均可以调用该类。

public:所有其他文件,不管是不是在同一个文件夹下,均可以调用该类。

final:禁止子类覆盖该方法(本篇不介绍)。

dynamic:动态类,可以往该类新增方法和属性。

说明:

1. final和dynamic,也是需要限定范围的。

如:dynamic class circle{},其实是internal dynamic class circle{}。所以同样只能被同一个包中的类调用。

如果想要所有位置都可调用,就需要public dynamic class circle{}

2. dynamic的作用是可以添加属性和方法。下面我做个简单的范例。

新建一个test.fla文件,在第一帧写入代码如下:

import area.*; //导入area文件夹下的类

var c:circle = new circle();

c.attr = 30; //使用dynamic属性新添加属性

trace(c.attr); //输出:30。说明添加属性成功

二、编辑类

我们继续完善circle类:

package area {

public dynamic class circle {

trace("正常运行circle类"); //类语句

private var radius:uint;

public var msg:String = "实例字符串";

public function circle() { //构造函数

radius = 5;

trace("构造函数");

}

public function getarea() { //自定义函数

return Math.PI * radius * radius;

}

}

}

(1) 类语句

在类中,不仅可以定义变量、常量和方法,还可以包含语句。但类体中的语句,只会在第一次创建类的实例时运行一次。

假设我们修改test.fla文件如下:

var a:circle = new circle();

var b:circle = new circle();

从输出结果中可以看出,类中的trace语句只运行了一次。

(2) 类元素的属性

类中的元素(常量、变量、方法),我们有六种属性来定义:(注意:这和定义类的属性不同)

internal(默认):元素对同一个包中的引用可见

private:元素对同一个类中的引用可见。

protected:元素对同一个类及子类中的引用可见(即使不在同一个文件夹)。

public:元素对所有位置的引用可见。

static:指定元素属于该类,而不是属于该类的实例。

spacename:用户自定义的命名空间(本章不介绍了)

相比以前的AS2.0,现有的AS3.0做了以下修改:

1) 新增了默认的internal属性。

2) AS3.0的private属性,比AS2.0更加严格,子类中无法调用。

3) AS3.0的protected属性,相当于AS2.0的private属性。

static属性是一个比较特殊的属性,经常用来存储一些和整个类相关的元素。但在自定义类中,其实用到的时候并不多。我对它的功能做个说明,但不举例了:

(1) 用static定义的类元素,称为静态属性(方法)。该元素属于类,不属于实例,需要用类名(而不是实例名)来访问。或者理解为,所有实例用的static属性都是同一个。

(2) 如果我们扩展一个子类,那么,在该子类中,可以访问基类的静态属性(方法)。但是,并不能继承。也就是说,该属性还是属于基类的。也许现在你对继承的概念还不是很清楚,没关系,下一篇我还会讲到的。

(3) 在As3.0中,可以在同一个类中,分别定义两个同名的静态属性和实例属性。但我本人不推荐这样做,没什么优点,反而在子类的继承中,会造成一些不必要的麻烦。

(3) 构造函数

1. 我们在创建一个类的同时,系统会自动添加一个和类相同名称的构造函数。但我们也可以手动修改这个构造函数。如示例中所示,构造函数只能用public属性定义函数

2. 每当你用new方法创建一个类的实例时,构造函数中的语句都会被执行一次。这个和类的语句是有区别的,类的语句只执行一次。

还是运行上例的test.fla,我们可以看到,类中的trace语句只运行了一次,但构造函数中的trace语句运行了两次。

3. 构造函数可以使用return语句结束,但不可以返回值,否则会报错。

(4) 自定义函数

关于自定义函数倒没有什么特别的介绍,和平时我们写函数的方法一样的。

我们通过自定义函数,来实现一个类具体的功能。比如该例中用来返回圆的面积。

三、调用类

我们新建一个new.fla文件。在第一帧写入代码如下:

import area.*; //导入area文件夹下的类

var c:circle = new circle();

trace(c.getarea());

第一行,使用import语句,引入我们创建的类。

第二行,用new方法,创建一个类的实例。

第三行,实例创建完成后,我们就可以调用类的元素了。

讲到这里,大家应该知道如何编写自己的类了吧。不过本篇介绍的都是最基本的用法,下篇,我还会介绍一些类的常用用法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  职场 休闲 AS
相关文章推荐