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

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

      可以说,编写自己的类,是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,休闲)