Flash/Flex学习笔记(8):ActionScript3.0中的面对对象

首先要习惯AS3.0的几个BT约定:

1.一个.as文件中,只能定义一个类
2.类名称必须与.as的文件名相同
3.类定义中必须要有package包声明
4.一个类最多只能有一个构造函数

5.包package的路径/名称约定:

这个初次接触时感觉有点小复杂,这样描述吧:

如果您在定义一个类时,package的声明指定了名称,比如 package jimmy{ public class MyClass{...}},那么也就意味着需要对它引用的fla/as文件同级目录下,必须要有jimmy目录,而且jimmy目录下必须要有MyClass.as文件,而且MyClass文件中定义的类名必须为MyClass

然后你再引用该类时,必须导入该包

import jimmy.MyClass;

然后才能引用比如: var mycls:MyClass = new MyClass();

简单来讲,就是package名必须与目录名准确匹配。

这里还有一种特殊情况:

假如定义的package名称为jimmy.yang,根据上面的解释,则同级目录下必须要有jimmy.yang目录,这是没问题的,但是还可以这样组织目录结构,先创建一个jimmy目录,然后再创建一个yang目录,然后把as文件放到jimmy/yang/目录下,即:如果package名称中有"点"时(比如package a.b),则目录./a.b/ 与./a/b/效果相同,推荐用后者,这样层次更分明

 

好了,开始定义第一个类:

package {
	public class Human {

		public function Human(){
			this._name = "暂无名字";
			trace("Human构造函数被调用!");
		}

		private var _name:String;
		public function get Name():String{
			return _name;
		}

		////仅本类及子类定义中可用(实际上这个编译能过,但无法在子类中使用)
//		protected function set Name(n:String):void{
//			this._name = n;
//		}

		public function SetName(n:String):void{
			this._name = n;
		}

		//属性 set get示例
		private var _sex:Boolean
		public function set Sex(v:Boolean):void{
			_sex = v;
		}
		public function get Sex():Boolean{
			return _sex;
		}

		public function Hello():void{
			trace(_name + " say:Hello World!");
			HiChildren();//测试在本类中调用受保护方法
		}

		//受保护方法
		protected function HiChildren():void{
			trace(_name + ":HiChildren");
		}

		//静态方法
		public static function WhoAmI():String{
			return "This is a Human Class"
		}
	}
}

 上面演示了构造器,属性(set/get),静态方法,受保护方法,注意:AS3中不支抽象类

package {
	public class Man extends Human {
		public function Man(n:String):void {
			super();
			SetName(n);
			super.Sex=true;
			trace("Man构造函数被调用!");
			HiChildren();//调用父类的受保护方法
		}

		//覆盖父类的性别设置函数
		public override function set Sex(v:Boolean):void {
			//Sex = true;//既然已经是男的,肯定是男的,这里就用不着了,除非咱们的系统支持"变性"
			trace("无法修改Man的性别");
		}

		//protected override function set Name(n:String):void{
//			//Name = n;//报错:对Name的引用有歧义
//		}

		public function ChaseGirls():void{
			trace(Name + "正在泡妞...");
		}
	}
}

 上面演示了类继承、覆写,下面调用这二个类测试一番:

var h:Human = new Human();
trace(h.Name);
h.Sex = true;
trace(h.Sex);
trace(Human.WhoAmI())
h.Hello();
//h.Name = "菩提树下的杨过";//这里会报错:属性只读,因为Name的set方法受保护
//h.HiChildren(); //同理无法调用 

var _man:Man = new Man("菩提树下的杨过");
_man.Sex = false;
trace("_man的性别:" + _man.Sex);
//trace(Man.WhoAmI());//静态方法将不被继承
_man.Hello();
//_man.HiChildren();//受保护方法无法在子类实例中使用
_man.ChaseGirls();

输出结果:
Human构造函数被调用!
暂无名字
true
This is a Human Class
暂无名字 say:Hello World!
暂无名字:HiChildren
Human构造函数被调用!
Man构造函数被调用!
菩提树下的杨过:HiChildren
无法修改Man的性别
_man的性别:true
菩提树下的杨过 say:Hello World!
菩提树下的杨过:HiChildren
菩提树下的杨过正在泡妞...

另外:做为符合ECMA规范的语言,ActionScript同样具有类似JavaScript的动态语言能力,我们把Human.cs再改一下:

package {
	public dynamic class Human {

		public function Human() {
			trace("Human构造函数被调用!");
		}

		public function toString():String {
			return "This is a Human instance!";
		}
	}
}

 注意dynamic关键字,加上这个后,Human就具备了动态修改属性的能力,看下面的测试代码:

var h:Human = new Human();
h.age = 10;
h.name = "菩提树下的杨过";
h.Say = function(){
	trace(h.name + ":Hello!" );
}
trace(h.toString());
trace(h.age);
trace(h.name);
h.Say();

var h2:Human = new Human();
trace(h2.age);//输出undefiend

输出结果:

Human构造函数被调用!
This is a Human instance!
10
菩提树下的杨过
菩提树下的杨过:Hello!
Human构造函数被调用!
undefined

如果一个类不想被继承,可以用final关键字标识,通常可以把一些辅助方法以static方式定义在final标识的类中,构成自己的工具类库(有点象c#中的静态类)

package {
	public final class MyUtils {

		public static function Test(s:String):String {
			trace(s);
			return s;
		}

		public static function Now():String {
			trace(new Date());
			return new Date().toLocaleString();
		}
	}
}

调用:

MyUtils.Test("hello test");
MyUtils.Now();

用final + static组合还能实现类似枚举的效果:

package {
	public final class LOGIN_REG_ERROR {
		public static const USERNAME_EXISTS = "用户名已存在";
		public static const PASSWORD_ERROR = "密码错误";
		public static const USENAME_ERROR = "用户名错误";
		//...
	}
}

使用示例:

var _loginResult:String;
if (_loginResult==LOGIN_REG_ERROR.USERNAME_EXISTS) {
	trace("用户名已存在!");
}

AS3.0还支持接口,看下面的代码

package {
	public interface IFly {
		function Fly():void;
	}
}
package {
	public class Duck implements IFly {
		public function Duck() {
			trace("来来,我是一只鸭子...");
		}

		public function Fly():void{
			trace("请叫我小飞侠,谢谢!")
		}
	}
}

最后看下原型链prototype:在javascript中正是得益于prototype才实现了很多惊人的应用,同样在as3.0中也存在原型链,所有动态属性的继承都可以通过原型继承实现,不过要注意的是:如果你准备对一个类进行prototype扩展以实现原型继承,则该类必须标识为dynamic,下面是示例代码:

var d:Duck = new Duck();
d.Fly();

Duck.prototype.Swim = function(){
	trace("正在游泳...请回避(裸泳?)");
}

d.Swim(); //请先将上一段代码中的Duck类定义加上dynamic关键字,否则本行代码无法执行

 

时间: 2024-10-28 08:55:47

Flash/Flex学习笔记(8):ActionScript3.0中的面对对象的相关文章

Flash/Flex学习笔记(34):AS3中的自定义事件

类似C#中自定义事件需要一个自定义的EventArgs子类一样,AS3也需要开发者自定义一个Event类的子类,这里我们假设一种场景:设计一个Person(人物)类,里面有Age(年龄),Name(姓名),我们希望每当Person类的实例Age(年纪)发生变化时,能触发一些自定义事件,从而调用某些特定的处理方法. 1.先设计Event类的子类AgeChangeEvent package { import flash.events.Event; public class AgeChangeEven

Flash/Flex学习笔记(37):不用系统组件(纯AS3)的视频播放器--只有8.82K

以前为了赶项目,利用系统组件制作过一款视频播放器(见Flash/Flex学习笔记(6):制作基于xml数据源的flv视频播放器),但是系统组件实在是太大了,最终生成的swf居然有103K,随着AS3的深入学习,昨天又弄了一个只用AS3的播放器,最终只有8.82K,呵呵,这肥减得那是相当厉害. 用到了上一篇(Flash/Flex学习笔记(35):自己动手实现一个滑块控件(JimmySilder))里自己写的的滑块控件,主要代码如下(关键是NetConnection与NetStream对象的使用):

Flash/Flex学习笔记(57):实用技巧

布朗运动: varnumDots:uint=50; varfriction:Number=0.9; vardots:Array; varlife:uint=0; functioninit(){ graphics.lineStyle(0,0xffffff,.5); dots=newArray(); for(vari:uint=0;i<numDots;i++){ vardot:Ball=newBall(2,0x00ff00); dot.x=Math.random()*stage.stageWidth

Flash/Flex学习笔记(24):粒子效果

粒子爆炸: 仍然要用到以前的小球类,不过稍加改造 package { import flash.display.Sprite; //小球 类 public class Ball extends Sprite { public var radius:uint;//半径 public var color:uint;//颜色 public var vx:Number=0;//x轴速度 public var vy:Number=0;//y轴速度 public function Ball(r:Number

Flash/Flex学习笔记(25):摩擦力与屏幕环绕

摩擦力: 假如一个物体在某个方向上沿直线运行,摩擦力会使该方向上的速度越来越小,直到停止. 上图示意了该过程,物体以moveAngle角度正向运动,最终的速度speed矢量为vx矢量与vy矢量的矢量和,在每个单位时间内的位移即Speed矢量的大小,分解到x,y轴后,即为vx与vy:加入摩擦力后,speed矢量每单位时间将减少Friction值,也就是视觉上的越来越慢. var ball:Ball = new Ball(10); ball.x = stage.stageWidth/2; ball.

Flash/Flex学习笔记(6):制作基于xml数据源的flv视频播放器

今天折腾了大半天,总算搞出了一个功能简单的视频播放器,可以向公司领导交差了 :) 步骤: 1.Flash CS4 中 先拖一个"FLVPlayback"组件到舞台上 注:FLVPlayback本身已经具备了flv播放的基本功能,简单设置下属性就能播放视频了 2.加载xml数据源 xml数据源格式如下: <?xml version="1.0" encoding="utf-8"?> <data> <item flv=&q

Flash/Flex学习笔记(44):万有引力与粒子系统

万有引用公式: 其中G为万有引力常数   var numParticles:uint=50;//粒子总数 var G:Number=0.03;//万有引力常数 var particles:Array=new Array(numParticles); var bounce:Number=-0.4;//边界反弹系统 //初始化 function init():void { particles = new Array(); for (var i:uint = 0; i < numParticles;

Flash/Flex学习笔记(51):3维旋转与透视变换(PerspectiveProjection)

Flash/Flex学习笔记(49):3D基础 里已经介绍了3D透视的基本原理,不过如果每次都要利用象该文中那样写一堆代码,估计很多人不喜欢,事实上AS3的DisplayObject类已经内置了z坐标.rotationX.rotationY.rotationZ属性,再加上PerspectiveProjection类用于处理透视转换,基本上可以满足大多数的3D要求. import flash.events.Event; import flash.display.Sprite; import fla

Flash/Flex学习笔记(5):捕获摄像头(续)--在线抓屏并保存到客户端本地

必须有摄像头上面的演示才能正常播放. 思路 使用摄像头以及在线抓屏在上一节Flash/Flex学习笔记(2)捕获摄像头 里已经讲过了就不重复粘贴了至于在客户端保存文件Flash里用起来也很简单:直接调用 FileReference 即可另外为了减少图片大小还可能借助AS3.0的扩展库项目地址http://code.google.com/p/as3corelib/把bmp格式的位置转换成jpeg再保存   扩展 结合本文的方法再配合Flash/Flex学习笔记(4)如何打开网页及Get/Post数