[转载]走在网页游戏开发的路上(四)
AS3之类
0. 前言
类:面向对象的基础,类是对象的抽象表示形式,类用来存储有关对象可保存的数据类型及对象可表现的行为的信息。
类的定义: |
[dynamic] [public | internal] [final] class className [ extends superClass ] [ implements interfaceName[, interfaceName... ] ] { // 此处是类定义 } |
在ActionScript 3.0中,可使用以下四个属性之一来修饰类定义:
属性 |
定义 |
dynamic |
允许在运行时向实例添加属性。 |
final |
不得由其它类扩展。 |
internal(默认) |
对当前包内的引用可见。 |
公共 |
对所有位置的引用可见。 |
使用 internal 以外的每个属性时,必须显式包含该属性才能获得相关的行为。请注意,列表中未包含名为 abstract 的属性。这是因为 ActionScript 3.0 不支持抽象类。同时还请注意,列表中未包含名为 private 和 protected 的属性。这些属性只在类定义中有意义,但不可以应用于类本身。如果不希望某个类在包以外公开可见,请将该类放在包中,并用 internal 属性标记该类。或者,可以省略 internal 和 public 这两个属性,编译器会自动为您添加 internal 属性。
若要指示对象可在运行时添加和访问动态属性,请在 class 语句前面放置 dynamic 关键字。若要声明一个类实现一个接口,请使用 implements 关键字。若要创建一个类的子类,请使用 extends 关键字。(某一类只能扩展一个类,但可以实现多个接口。)您可以在一个语句中使用 implements 和 extends。
ActionScript 3.0不但允许在类体中包括定义,而且还允许包括语句。
1. 类文件.as
每个ActionScript源文件只能包含一个对其它源文件或脚本可见的类。外部可见的类可以是公共类或内部类,必须在包(package)语句内定义。如果在同一个文件中包括其它类,则该类必须放在包(package)语句之外、文件结尾处。
外部可见的类的名称必须与包含该类的 ActionScript 源文件的名称匹配。源文件名称必须是类的名称加上文件扩展名 .as。例如,如果您将一个类命名为 Student,则定义该类的文件必须被命名为 Student.as。
您不能嵌套类定义:即,不能在一个类定义内定义其它类。
可以定义构造函数方法,每次创建该类的新实例时执行该方法。该构造函数方法的名称必须与类的名称匹配。如果未定义构造函数方法,则为您创建一个默认的构造函数。
ActionScript提供了可以与类的任何属性 (property) 一起使用的一组属性 (attribute)。下表列出了这组属性。
属性 |
定义 |
internal(默认) |
对同一包中的引用可见。 |
private |
对同一类中的引用可见。 |
protected |
对同一类及派生类中的引用可见。 |
public |
对所有位置的引用可见。 |
static |
指定某一属性属于该类,而不属于该类的实例。 |
UserDefinedNamespace |
用户定义的自定义命名空间名。 |
2. 构造函数
在ActionScript 3.0中,构造函数是一个特殊的方法,不能声明返回类型,必须留空。构造函数只能使用public访问控制。如果没有指定访问控制,编译器默认将构造函数设为public。private、protected、internal及其它所有自定义的命名空间都不能用于构造函数。
现在问题来了,在java,c#等语言中一般使用private修饰构造函数,阻止实例化,在ActionScript 3.0中构造函数是public的,那么如何实现单例模式,阻止实例化呢?ActionScript 3.0中一般是这样做的:
ActionScript3.0中单例模式 |
public class ModelLocator extends EventDispatcher { public static var _instance:ModelLocator; public static function getInstance():ModelLocator{ if(_instance == null){ _instance = new ModelLocator(); } return _instance; } |
3. 静态属性和方法
静态属性和静态方法不依赖实例而独立存在。简单地说,即使不创建一个类的实例,也可以访问到该类的静态属性和静态方法。这一点就和实例属性、实例方法完全不同。
静 态属性存储所有对象共同的状态,和任何实例都没有关联。每个对象的实例属性值可以各不相同,但所有类对象的静态属性值是一致的。改变一个对象的实例属性不 会影响到另一个对象的实例属性,但改变一个类的静态属性值则会影响该类所有的对象。静态方法也是独立与所有的实例,静态方法只和每个类绑定,不和类的任何 具体实例绑定。
注:静态方法经常应用到工具类中,工具中包括一系列的静态方法,这样可以不用创建工具类的实例。
4. get和set存取器方法
get和set存取器函数还分别称为getter和setter,可以使用这些函数为创建的类提供易于使用的编程接口,并遵循信息隐藏和封装的编程原则。使用get和set函数可保持类的私有类属性,但允许类用户访问这些属性,就像他们在访问类变量而不是调用类方法。
l 这种方法的好处是,可避免出现具有不实用名称的传统存取器函数,如getPropertyName()和setPropertyName()。
l getter和setter的另一个好处是,使用它们可避免允许进行读写访问的每个属性有两个面向公共的函数。
使用getter和setter函数还可以覆盖从超类继承来的属性,这是使用常规类成员变量时不能做到的。在子类中不能覆盖使用var关键字声明的类成员变量。但是,使用getter和setter函数创建的属性没有此限制。可以对从超类继承的getter和setter函数使用override属性。
5. 方法重载
ActionScript 3.0中并不支持方法重载!
但ActionScript 3.0中存在和C语言中printf函数一样的可变参数…机制,可以使用…参数机制实现类似重载的机制。但是我想说,先天不全做再多努力也不济。希望在后续版本中会增强实现函数重载。
6. 包、类及相关概念
l 包外:是相当于公共权限,这个层次的代码可以被任意的第三方访问。
l 包:是二级访问,包内的成员可以互相访问,但是包内的成员不能被包外访问
l 类:在类的内部成员可以互相访问,但是外部无法访问私有成员
l 包外类:只能被包中的类访问,它属于当前类的私有类。此包外类对外不可见。定义位置为package{ }外。可以定义一个或者多个class类。但类名不能与文件同名。
接下来的文章我将介绍:
-
ActionScript3的事件机制
-
ActionScript3的动画原理
-
ActionScript3获取外部数据(加载XML、JS通信)
-
ActionScript3开发一个转盘抽奖程序
-
ActionScript3实现游戏中的计时器
-
ActionScript3中像素穿透(碰撞检测)
-
。。。
作者:吴秦
出处:http://www.cnblogs.com/skynet/
本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名吴秦(包含链接).