首先要习惯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/效果相同,推荐用后者,这样层次更分明

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

view source

print?

01
package {

02
public class Human {

03

04
public function Human(){

05
this._name = "暂无名字";

06
trace("Human构造函数被调用!");

07
}

08

09
private var _name:String;

10
public function get Name():String{

11
return _name;

12
}

13

14
仅本类及子类定义中可用(实际上这个编译能过,但无法在子类中使用)

15
//      protected function set Name(n:String):void{

16
//          this._name = n;

17
//      }

18

19

20
public function SetName(n:String):void{

21
this._name = n;

22
}

23

24
//属性 set get示例

25
private var _sex:Boolean

26
public function set Sex(v:Boolean):void{

27
_sex = v;

28
}       

29
public function get Sex():Boolean{

30
return _sex;

31
}

32

33
public function Hello():void{

34
trace(_name + " say:Hello World!");

35
HiChildren();//测试在本类中调用受保护方法

36
}

37

38
//受保护方法

39
protected function HiChildren():void{

40
trace(_name + ":HiChildren");

41
}

42

43
//静态方法

44
public static function WhoAmI():String{

45
return "This is a Human Class"

46
}           

47
}   

48
}

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

view source

print?

01
package {

02
public class Man extends Human {

03
public function Man(n:String):void {

04
super();

05
SetName(n);

06
super.Sex=true;

07
trace("Man构造函数被调用!");

08
HiChildren();//调用父类的受保护方法

09
}

10

11
//覆盖父类的性别设置函数

12
public override function set Sex(v:Boolean):void {

13
//Sex = true;//既然已经是男的,肯定是男的,这里就用不着了,除非咱们的系统支持"变性"

14
trace("无法修改Man的性别");

15
}

16

17

18
//protected override function set Name(n:String):void{

19
//          //Name = n;//报错:对Name的引用有歧义

20
//      }

21

22

23
public function ChaseGirls():void{

24
trace(Name + "正在泡妞...");

25
}

26
}

27
}

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

view source

print?

01
var h:Human = new Human();

02
trace(h.Name);

03
h.Sex = true;

04
trace(h.Sex);

05
trace(Human.WhoAmI())

06
h.Hello();

07
//h.Name = "菩提树下的杨过";//这里会报错:属性只读,因为Name的set方法受保护

08
//h.HiChildren(); //同理无法调用 

09

10
var _man:Man = new Man("菩提树下的杨过");

11
_man.Sex = false;

12
trace("_man的性别:" + _man.Sex);

13
//trace(Man.WhoAmI());//静态方法将不被继承

14
_man.Hello();

15
//_man.HiChildren();//受保护方法无法在子类实例中使用

16
_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再改一下:

view source

print?

01
package {

02
public dynamic class Human {

03

04
public function Human() {

05
trace("Human构造函数被调用!");

06
}

07

08
public function toString():String {

09
return "This is a Human instance!";

10
}

11
}

12
}

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

view source

print?

01
var h:Human = new Human();

02
h.age = 10;

03
h.name = "菩提树下的杨过";

04
h.Say = function(){

05
trace(h.name + ":Hello!" );

06
}

07
trace(h.toString());

08
trace(h.age);

09
trace(h.name);

10
h.Say();

11

12
var h2:Human = new Human();

13
trace(h2.age);//输出undefiend

输出结果:

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

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

view source

print?

01
package {

02
public final class MyUtils {

03

04
public static function Test(s:String):String {

05
trace(s);

06
return s;

07
}

08

09
public static function Now():String {

10
trace(new Date());

11
return new Date().toLocaleString();

12
}

13
}

14
}

调用:

view source

print?

1
MyUtils.Test("hello test");

2
MyUtils.Now();

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

view source

print?

1
package {

2
public final class LOGIN_REG_ERROR {

3
public static const USERNAME_EXISTS = "用户名已存在";

4
public static const PASSWORD_ERROR = "密码错误";

5
public static const USENAME_ERROR = "用户名错误";

6
//...

7
}

8
}

使用示例:

view source

print?

1
var _loginResult:String;

2
if (_loginResult==LOGIN_REG_ERROR.USERNAME_EXISTS) {

3
trace("用户名已存在!");

4
}

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

view source

print?

1
package {

2
public interface IFly {

3
function Fly():void;

4
}

5
}

view source

print?

01
package {

02
public class Duck implements IFly {

03
public function Duck() {

04
trace("来来,我是一只鸭子...");

05
}

06

07
public function Fly():void{

08
trace("请叫我小飞侠,谢谢!")

09
}

10
}

11
}

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

view source

print?

1
var d:Duck = new Duck();

2
d.Fly();

3

4
Duck.prototype.Swim = function(){

5
trace("正在游泳...请回避(裸泳?)");

6
}

7

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

转载于:https://www.cnblogs.com/happysky97/archive/2010/11/22/1884481.html

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

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

    类似C#中自定义事件需要一个自定义的EventArgs子类一样,AS3也需要开发者自定义一个Event类的子类,这里我们假设一种场景:设计一个Person(人物)类,里面有Age(年龄),Name(姓 ...

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

    Flash/Flex学习笔记(49):3D基础 里已经介绍了3D透视的基本原理,不过如果每次都要利用象该文中那样写一堆代码,估计很多人不喜欢,事实上AS3的DisplayObject类已经内置了z坐标 ...

  3. Flash/Flex学习笔记(30):不用startDrag和stopDrag的对象拖动

    对于从Sprite类继承来的对象,要实现拖放当然是Flash/Flex学习笔记(13):对象拖动(startDrag/stopDrag) 里讲的方法最方便,但是对于不是从Sprite类继承得来的对象, ...

  4. Flash/Flex学习笔记(50):3D线条与填充

    3D线条:把上一篇中的3D坐标旋转示例稍做修改,用线把各个小球连接起来即可. var balls:Array; var numBalls:uint=30;var fl:Number=250; var ...

  5. Flash/Flex学习笔记(53):利用FMS快速创建一个文本聊天室

    先来看客户端fla的构成: 第一帧:登录界面 第一帧的代码: show sourceview source print? 01 import flash.events.MouseEvent; 02 i ...

  6. Flash/Flex学习笔记(38):动量守恒与能量守恒

    动能公式: 动量公式: 动量守恒: 能量守恒: 根据这些规律可以得到下列方程组: 解该方程组,得到下面的公式: 把这二个公式相减,可以得到: 即: 我们也经常利用这个公式简化运算 基本的动量守恒演示: ...

  7. Flash/Flex学习笔记(43):动量守恒与能量守恒

    动能公式: 动量公式: 动量守恒: 能量守恒: 根据这些规律可以得到下列方程组: 解该方程组,得到下面的公式: 把这二个公式相减,可以得到: 即: 我们也经常利用这个公式简化运算 基本的动量守恒演示: ...

  8. Flash/Flex学习笔记(4):如何打开网页及Get/Post数据

    flash终究只是客户端技术,所以很多时候还是需要与服务端技术(比如asp,asp.net,jsp,php之类)进行数据交互的,下面的代码演示了如何在flash中打开网页,以及用GET/POST二种方 ...

  9. Flash/Flex学习笔记(2):捕获摄像头

    Flash中使用摄像头,个人感觉比silverlight要更容易 时间轴第一帧上敲以下代码就可以了: //import fl.controls.Label; //var camera:Camera = ...

最新文章

  1. etcd 笔记(07)— 键值对读写操作过程
  2. 生死讯息:密码背后的数学
  3. 【中国超算迎来最强对手】 IBM推出机器学习加速“瑞士军刀”Power9芯片,性能为同类产品的10倍...
  4. EditText获得焦点后,如何关闭软键盘
  5. 集合框架源码分析三(实现类篇ArrayList,LinkedList,HashMap)
  6. dotnet core开发体验之开始MVC
  7. 【ArcGIS风暴】ArcGIS10.6获取栅格影像边界范围的三种方法案例详解
  8. 什么?面试官问我Java内存模型!这不得给我加薪?
  9. PJAX初体验(主要是利用HTML5 新增API pushState和replaceState+AJAX)
  10. Rem布局的原理解析
  11. Apache和Nginx防盗链
  12. pytorch函数测试
  13. prosody xmpp_如何在Ubuntu 18.04上安装Prosody
  14. 读书笔记《蛤蟆先生去看心理医生》
  15. 了凡四训 第一篇《立命之学》
  16. Module not specified
  17. QTableWidget获取一行数据
  18. SuperMap iDesktop 9D 制作专题地图
  19. 加速ubuntu开机速度
  20. 台式电脑显示配置100%请勿关闭计算机,Win7关机提示“配置Windows Update已完成30%请勿关闭计算机”怎么解决...

热门文章

  1. 计算机的第一级存储器有,计算机等级考试题库重点!一级MS Office第二章“存储器”...
  2. element table 合计 第一行 固定列
  3. NFS 在线安装和离线安装方式
  4. 硬件 - 数字电路 - 使用反向门、与门、或门搭建二选一的多路选择器
  5. 带你读懂测绘4D产品
  6. 图片放大后变模糊怎么办?
  7. 机器学习--- 交叉熵损失(CrossEntropy Loss)--(附代码)
  8. 3D游戏(9)——UI系统
  9. 混沌数学之ASin模型
  10. SQL 查找表名,字段名