####################
# 面向对象编程概念
####################
1 类文件
区分OOP程序和过程式程序的是代码的拆分方式。过程式程序使用的是长序列的代码。而OOP程序则会把代码 分成多个更小、更专门化的文件,这些文件被称为类文件(class file)。
类文件就是一个独立的程序,其中包含执行某个专门任务或某组相关任务所需要的全部变量[也叫属性(property)]和方法。它们还充当着对象(object)的基础或模板。对象即类文件在内存中的一个副本。在所有项目中,类文件和它们创建的对象都可以根据需要互相调用。
因为类文件是独立且专用的,所以我们可以随时在任意项目中使用它们。从本质上讲,AS 3.0 和其他OOP编程环境一样,只是类文件的一个大型集合。在使用AS 3.0工作的时候,类文件的库可能会增大。我们可以编写自己的类文件,也可以从各种来源下载它们。最后的结果就是:随着时间的推移,我们的编码工作会越来越少,对可用类文件及其使用方法的研究则会越来越多。编码工作的减少意味着更快的项目完成速度和更低的出错率。在往下学习过程中,我们会用到各种各样的类文件。要点即:不要做多此一举的事。如果已经有现成的,那就直接用好了。
所有类都附有两个潜在的编程构造:属性和方法(method)。之所以说“潜在”,是因为类文件并不是必须具备这两个构造。属性和方法是OOP术语。属性就是附加到类文件上的变量,方法则是附加到类文件上的函数。
(一些书籍会提到类文件所附的第3个构造:事件监听器(event listener),或简称事件( event ),在我/*(作者)*/看来,事件监听器就是一个专用方法)
2 继承
类文件是一种将应用程序模块化成多个小的、可复用构建块的强大方法。而继承(inheritance)让我们又有了一个可复用性因素。可类比:
试想我们有一个称为Animals的类。其内是一些无视动物类型、与所有动物相关的属性和方法。现在,假设我们需要编写一个称为Cats的类。猫显然是动物。作为程序员,你想重新编写与动物关联的全部属性和方法,然后再添加与猫相关的特定属性和方法吗?大家八成是不乐意的!那太费时间了。相反,我们要做的全部工作就是编写下列这行代码:
public class Cats extends Animals
这行代码允许新类Cats访问与Animals关联的属性和方法。
现在,假设我们要再编写两个类LongHair和ShortHair。这两个类都可以扩展(extend)Cats类,后者又会扩展Animals类。
层级越往下,类文件的专用程度越高。
继承和扩展一词是等同的。
有趣的是,升到所有层级之上的时候,就会来到一个无所不包的起点。该起点是一个称为Object的类。实际上其他所有类文件都自动继承自这个类文件。
3 包
库中有成百上千类文件后,我们就会想把它们组织到相关的组中,在OOP程序中,是通过创建目录结构的方式来组织它们,就像在硬盘驱动器上整理其他事物那样。不过,类文件在必要的时候需要互相调用。为了让这个过程运转得容易一些,我们不是输入目录的路径,而是把这些目录结构称为包(package)。每个类文件中都会有相应代码来标识它所属的包。我们所要做的就是在需要的时候创建到这些包的引用。
AS 3.0将包的概念向前推进了一步。诸如Java之类的大多数OOP环境只允许我们将整个类文件打包。AS 3.0 则允许我们将各个方法和属性分别打包。这意味着我们可构建属性和方法库,且它们不必与特定的类文件相关联。且在这之后我们可让类文件在需要时访问这些属性和方法。这一强大的功能可为我们节省大量的编程时间和精力。
此外,包还可控制关键词public和private的拥有者所能看到的信息。
4 ActionScript 3.0 Language Reference
善用之!
5 面向对象的系统设计
一些高级应用程序需要用到大量的对象,UML就是用来设计这些对象之间的交互方式的。它还解决了类文件自身的设计和架构。
假定我们刚刚完成了项目所需的全部规划文档,并且写好了用例分析。现在开始逐句地阅读写好的文档。每个句子中的名词都可能代表着所需要的类文件。对于每个类文件,形容词就是与这个类文件相关的属性,动词则是与其相关的方法。
####################
# 类文件初探
####################
1 理解代码
包是组织相关类文件的一种方法。它会把类文件编组到目录结构中。
和如今的其他OOP编程环境不同,AS 3.0要求所有类文件都属于一个包。这是必要条件,而非可选条件。因此,所有包文件的代码必须以关键词package开头,后跟一对大括号。
Code:
package {
import flash.display.Sprite;
public class chapter3ActionScript extends Sprite
{
public function Chapter3ActionScript()
{
}
}
}
在看到与包相关的大括号时,应注意它们囊括了类文件的所有代码(根据缩进格式可以很容易地看到这一点)。还应注意关键词package之后并没有名称。这意味着当前的目录Chapter3ActionScript/bin就是包。为什么不根据需要移动类文件所处的位置呢?因为这不是个好做法。在很多情况下,那些类文件可能需要访问其他类文件,而后者可能也需要访问另外的类文件,等等。一旦移动了某些文件的位置,类或代码文件就不知道该去哪里找它们,最后我们就会乱作一团。
import语句允许类文件与其他包中的类文件对话。它并不会移动其他类文件的位置或制作副本。它只是创建一个路径或引用,将那个类的功能有效地导入到包中,以方便我们使用。它不会给随后的SWF文件添加额外的大小。
注意Sprite类文件属于flash.display包。虽然包是一个目录结构,但大多数OOP环境会使用一个点(.)来表明子目录级别。这意味着flash目录下有一个名为display的目录。
(不要寻找目录,你找不到它。内部的AS 3.0包被归档在叫做JAR文件[JAR代表Java Archived(Java归档)]的压缩文件中)
类定义不是语句,所以代码行结尾不需要有分号。
类文件名与包含该类的文件名称须匹配。
2 类文件功能
2.1 注释
Code:
/*This file was created on 4/10/2006
by Charles E. Brown
to demonstrate the parts of an ActionScript 3.0 class file*/
以上为作者为类文件注释。
2.2 使用trace()方法
trace()为顶级函数(top-level function),可随时使用。
2.3 转义序列
##############################
# MXML与ActionScript 3.0的结合
##############################
1 添加AS代码
Code:
<mx:Script>
<![CDATA[
]]>
</mx:Script>
上面代码称为CDATA节(CDATA section),它是XML文档中的常见构造。实质上,它的作用是分离出部分文档以进行专门的处理,并防止其内包含的代码和XML文档的其余部分一起参与解析。CDATA节通常用于添加非XML代码。不过在Flex中,它主要用于向MXML文档添加AS代码。
(CDATA会告诉Flex不要像处理MXML那样处理其内包含的脚本)
2 AS构造
2.1 变量
变量(variable)是内存中用来临时存储数据,以备将来使用的某个地方。
变量可比作容器,用来存放特定类型的容器。即,变量只存放某个特定类型的项,在编程术语中,这叫做强类型(strict typing),它意味着我们要将变量指派给一个类文件,该类文件的属性和方法会告诉变量什么可以做,什么不可以做。
Code:
<mx:Label id="myLabel" text="{myName}" />
其逻辑含义是:text属性应该读取变量myName,然后用其内容填写Label控件。
2.2 函数
Code:
function addNumbers():String
函数的第1行叫做签名(signature)。
return 行的拼接(concatenation)中,每个事物(不论它是数字还是字符串)都会被转换成一个字符串。
3.3 处理事件
####################
# 可复用性
####################
Code:
<mx:Script source="MyCode.as" />
<--End-->