代码改变世界

走在网页游戏开发的路上(四)

2011-06-05 17:14  吴秦  阅读(9005)  评论(7编辑  收藏  举报

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访问控制。如果没有指定访问控制,编译器默认将构造函数设为publicprivateprotectedinternal及其它所有自定义的命名空间都不能用于构造函数。

现在问题来了,在javac#等语言中一般使用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.  getset存取器方法

getset存取器函数还分别称为gettersetter,可以使用这些函数为创建的类提供易于使用的编程接口,并遵循信息隐藏和封装的编程原则。使用getset函数可保持类的私有类属性,但允许类用户访问这些属性,就像他们在访问类变量而不是调用类方法。

l  这种方法的好处是,可避免出现具有不实用名称的传统存取器函数,如getPropertyName()setPropertyName()

l  gettersetter的另一个好处是,使用它们可避免允许进行读写访问的每个属性有两个面向公共的函数。

使用gettersetter函数还可以覆盖从超类继承来的属性,这是使用常规类成员变量时不能做到的。在子类中不能覆盖使用var关键字声明的类成员变量。但是,使用gettersetter函数创建的属性没有此限制。可以对从超类继承的gettersetter函数使用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中像素穿透(碰撞检测)

  • 。。。