<b> 一、类的继承</b>
<b> </b>类的继承是类的一个重要用法。使用继承,我们可以重复利用基类中的代码,而不必重写代码。我们可以继承AS自带的类,如event等,也可以继承我们自定义的类。
<b> </b>下面,我们将写一个新的as脚本,继承上篇的circle.as。
<b> </b>(1) 我们在area文件夹下,新建一个名为square.as的as文件,填入代码如下:
<b> </b>package area {
<b> </b><b> </b>public class square extends circle {
<b> </b><b> </b><b> </b>public function info() {
<b> </b><b> </b><b> </b><b> </b>trace("类的继承");
<b> </b><b> </b><b> </b>}
<b> </b><b> </b>}
<b> </b>}
<b> </b>(2) 我们回到上层目录,打开new.fla文件,修改代码如下:
<b> </b>var s:square = new square();
<b> </b>trace(s.getarea()); //输出:基类中圆的面积
<b> </b>trace(s.info()); //输出:子类中info函数的trace语句
<b> </b>继承类使用的是extends方法,参见示例。由示例可见,继承的两个最大作用为:1.使用基类的代码。2.新增自己的代码。
<b> </b><b>二、覆盖“基类的方法”</b>
<b> </b>如上例,我们继承了类后,希望输出的面积是新的面积公式,并且还是想使用getarea()方法,但该方法已经被占用,怎么办?没关系,我们可以覆盖基类的该方法。我们修改square.as的代码如下:
<b> </b><b> </b><b> </b>private var side:uint = 5;
<b> </b><b> </b><b> </b>override public function getarea() {
<b> </b><b> </b><b> </b><b> </b>return side * side;
<b> </b>打开new.fla,运行如下代码:
<b> </b>var c:circle = new circle();
<b> </b>trace(c.getarea()); //输出:圆的面积
<b> </b>trace(s.getarea()); //输出:正方形面积
<b> </b>覆盖类使用的是override方法,参见示例。但是在覆盖类的时候,有以下几点限制:
<b> </b>(1) 覆盖方法和基类方法的控制权限必须相同
<b> </b>(2) 覆盖方法和基类方法传递的参数数量和参数类型必须相同(参数名称可以不同)
<b> </b>(3) 覆盖方法和基类方法返回值的数据类型必须相同
<b> </b><b>三、get和set存储器方法</b>
<b> </b>让我们先来看两个例子:
<b> </b>例1:
<b> </b>public class circle {
<b> </b><b> </b>public var _msg:String = "测试字符串";
<b> </b>例2:
<b> </b><b> </b>private var msg:String = "测试字符串";
<b> </b><b> </b>public function get _msg():String { //get存储器
<b> </b><b> </b><b> </b>return msg;
<b> </b><b> </b>public function set _msg(str:String):void { //set存储器
<b> </b><b> </b><b> </b>msg = str;
<b> </b>例1在类体内定义了一个public的string变量。
<b> </b>例2在类体内定义了一个private的string变量,然后通过get存储器控制变量值的读取,用set存储器控制变量值的修改。
<b> </b>然后我们在Fla文件中,均可以运行以下语句:
<b> </b>trace(c._msg);
<b> </b>c._msg = "新的字符串";
<b> </b>可以看到,两者的效果是相同的。
<b> </b>
<b> </b>既然这样,为什么还要使用get和set存储器呢?他们的作用是什么呢?
<b> </b>(1) 使用例1,我们必须同时开放读权限和写权限。而使用get和set存储器,我们可以实现有选择的开放读权限和写权限。
<b> </b>(2) 我们可以在get和set存储器中添加语句,在不改变变量本身的同时做一些处理。
<b> </b>比如:return (msg+5),类似这样的语句。
<b> </b>(3) 扩展子类的时候,例1方式中的_msg是不可以被覆盖的(只能覆盖方法),但例2中,可以覆盖get和set存储器。
如果你不需要用到上面这3种情况,那么我建议还是用例1的方式来实现。简洁多了,还不容易出错!
<b> </b><b>四、嵌入资源类</b>
<b> </b>有时候我们可能会需要往Flash文件里嵌入一些资源,如MP3、视频、图像、字体等。嵌入资源的好处是,可以确保当需要的时候立即能用。缺点是,会增加生成的swf文件大小(因为是把资源直接放入到生成的swf文件里了)。
什么样的资源适合嵌入呢?我的建议是,文件体积不大,但使用频繁,或者对使用的即时性要求比较高的资源,可以考虑嵌入。比如我们做一个枪战的游戏,那么发射子弹时“嘭”的声音,嵌入到文件是合适的选择。当然,这个不可以一概而论,需要根据实际情况做决定。
<b> </b>下面我以嵌入和播放MP3为例,简单介绍下怎么嵌入资源和使用嵌入的资源:
<b> </b>(1) 首先,将mp3导入到库,如下图所示:
<b> </b>(2) 在库里,右键点击刚加载的mp3,选择“链接”,如下图:
<b> </b>(3) 自己取一个合适的类名,注意也不要用到Flash的关键字哦,如下图所示:
<b> </b>(4) 在Flash的第一帧写入代码如下:
<b> </b>var mp3:dance = new dance();
<b> </b>mp3.play();
<b> </b>运行下,是否听到导入的声音了呢 :)
类的用法就先讲到这里了。如果你全部弄明白的话,那么一般的类的用法应该都会了。接下来,就要看你自己的发挥,把类用到实处了。呵呵!
本文转自 windtoto 51CTO博客,原文链接:http://blog.51cto.com/windtoto/385256,如需转载请自行联系原作者