且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

揭开AS程序的外纱(十) -- 类的一些常用用法

更新时间:2022-09-16 21:13:33

      一、类的继承

 

      类的继承是类的一个重要用法。使用继承,我们可以重复利用基类中的代码,而不必重写代码。我们可以继承AS自带的类,如event等,也可以继承我们自定义的类。

      下面,我们将写一个新的as脚本,继承上篇的circle.as。

      (1) 我们在area文件夹下,新建一个名为square.as的as文件,填入代码如下:

      package area {

            public class square extends circle {

                  public function info() {

                        trace("类的继承");

                  }

            }

      }

      (2) 我们回到上层目录,打开new.fla文件,修改代码如下:

      var s:square = new square();

      trace(s.getarea()); //输出:基类中圆的面积

      trace(s.info()); //输出:子类中info函数的trace语句

 

      继承类使用的是extends方法,参见示例。由示例可见,继承的两个最大作用为:1.使用基类的代码。2.新增自己的代码。

 

 

      二、覆盖“基类的方法”

 

      如上例,我们继承了类后,希望输出的面积是新的面积公式,并且还是想使用getarea()方法,但该方法已经被占用,怎么办?没关系,我们可以覆盖基类的该方法。我们修改square.as的代码如下:

      package area {

            public class square extends circle {

                  private var side:uint = 5;

                  override public function getarea() {

                        return side * side;

                  }

            }

      }

      打开new.fla,运行如下代码:

      var c:circle = new circle();

      var s:square = new square();

      trace(c.getarea()); //输出:圆的面积

      trace(s.getarea()); //输出:正方形面积

      覆盖类使用的是override方法,参见示例。但是在覆盖类的时候,有以下几点限制:

      (1) 覆盖方法和基类方法的控制权限必须相同

      (2) 覆盖方法和基类方法传递的参数数量和参数类型必须相同(参数名称可以不同)

      (3) 覆盖方法和基类方法返回值的数据类型必须相同

 

 

      三、get和set存储器方法

      让我们先来看两个例子:

      例1:

      public class circle {

            public var _msg:String = "测试字符串";

      }

      例2:

      public class circle {

            private var msg:String = "测试字符串";

            public function get _msg():String { //get存储器

                  return msg;

            }

            public function set _msg(str:String):void { //set存储器

                  msg = str;

            }

      }

 

      例1在类体内定义了一个public的string变量。

      例2在类体内定义了一个private的string变量,然后通过get存储器控制变量值的读取,用set存储器控制变量值的修改。

      然后我们在Fla文件中,均可以运行以下语句:

      var c:circle = new circle();

      trace(c._msg);

      c._msg = "新的字符串";

      trace(c._msg);

      可以看到,两者的效果是相同的。

     

      既然这样,为什么还要使用get和set存储器呢?他们的作用是什么呢?

      (1) 使用例1,我们必须同时开放读权限和写权限。而使用get和set存储器,我们可以实现有选择的开放读权限和写权限。

      (2) 我们可以在get和set存储器中添加语句,在不改变变量本身的同时做一些处理。

      比如:return (msg+5),类似这样的语句。

      (3) 扩展子类的时候,例1方式中的_msg是不可以被覆盖的(只能覆盖方法),但例2中,可以覆盖get和set存储器。

      如果你不需要用到上面这3种情况,那么我建议还是用例1的方式来实现。简洁多了,还不容易出错!

 

 

      四、嵌入资源类

 

      有时候我们可能会需要往Flash文件里嵌入一些资源,如MP3、视频、图像、字体等。嵌入资源的好处是,可以确保当需要的时候立即能用。缺点是,会增加生成的swf文件大小(因为是把资源直接放入到生成的swf文件里了)。

      什么样的资源适合嵌入呢?我的建议是,文件体积不大,但使用频繁,或者对使用的即时性要求比较高的资源,可以考虑嵌入。比如我们做一个枪战的游戏,那么发射子弹时“嘭”的声音,嵌入到文件是合适的选择。当然,这个不可以一概而论,需要根据实际情况做决定。

     

      下面我以嵌入和播放MP3为例,简单介绍下怎么嵌入资源和使用嵌入的资源:

      (1) 首先,将mp3导入到库,如下图所示:

      揭开AS程序的外纱(十) -- 类的一些常用用法

      (2) 在库里,右键点击刚加载的mp3,选择“链接”,如下图:

      揭开AS程序的外纱(十) -- 类的一些常用用法

      (3) 自己取一个合适的类名,注意也不要用到Flash的关键字哦,如下图所示:

      揭开AS程序的外纱(十) -- 类的一些常用用法

      (4) 在Flash的第一帧写入代码如下:

      var mp3:dance = new dance();

      mp3.play();

      运行下,是否听到导入的声音了呢 :)

 

      类的用法就先讲到这里了。如果你全部弄明白的话,那么一般的类的用法应该都会了。接下来,就要看你自己的发挥,把类用到实处了。呵呵!










本文转自 windtoto 51CTO博客,原文链接:http://blog.51cto.com/windtoto/385256,如需转载请自行联系原作者