第6章面向对象编程基础•面向对象的编程,其英文是“Object-OrientedProgramming”,简写为OOP。它以对象为基本单元来进行代码划分,组织程序代码。ActionScript3.0是一个完全标准的面向对象编程语言。面向对象编程在Flash5已经开始支持,可惜语法不是业界传统的编程语言格式,在Flash5和FlashMX中编写面向对象的编程非常的不方便。ActionScript2.0在面向对象的编程上有很大的进步,但是由于其使用的并不完全符合标准,存在很多的问题。现在ActionScript3.0的推出基本解决了ActionScript2.0中存在的问题,并有了很多的改进,而且相对于其它的OOP语言,其更简单易学。6.1面向对象编程技术概述•面向对象编程中最重要也最难以理解的概念就是“对象”。对象,指的是具有某种特定功能的程序代码。•对象(Object)具体可以指一件事、一个实体、一个名词,一个具有自己的特定标识的东西。比如汽车、人、房子、桌子、植物、支票、雨衣等等都是对象。对象就是一种客观存在,可能有时你觉得虚无飘渺,但是却的的确确存在着。•任何一个对象都有其属性。以人为例,人有身高、体重、性别、血型、年龄等等,这些都反映了人作为一个社会存在所共有的特性。把这些特性反映到编程语言中,这些特性就是属性,用来反映某一个对象的共有特点。6.2类•对象是抽象的概念,要想把抽象的对象变为具体可用的实例,则必须使用类。使用类来存储对象可保存的数据类型,及对象可表现的行为信息。要在应用程序开发中使用对象,就必须要准备好一个类,这个过程就好像制作好一个元件并把它放在库中一样,随时可以拿出来使用。本节从类的基本概念着手,逐步介绍类的定义方法和类的使用方法。6.2.1类的概述•类(Class)就是一群对象所共有的特性和行为。•早在ActionScript1.0中,程序员使用原型(Prototype)扩展的方法,来创建继承或者将自定义的属性和方法添加到对象中来,这是类在Flash中的初步应用。在ActionScript2.0中,通过使用class和extends等关键字,正式添加了对类的支持。ActionScript3.0不但继续支持ActionScript2.0中引入的关键字,而且还添加了一些新功能,如通过protected和internal属性增强了访问控制,通过final和override关键字增强了对继承的控制。•下面来简单了解一下ActionScript3.0中类(Class)的构成。具体的类结构及实现方法,请参见6.2.2节的内容。•包块和类(Class)的名称。•构造函数。•属性:包括实例属性和静态属性。•方法:包括实例方法和静态方法。6.2.2创建自定义的类•创建一个自定义类的操作步骤如下:•(1)建立一个准备保存类文件的目录,即为一个包(package)。比如在计算机中有个目录“F:\Test”。•(2)启动AdobeFlashCS5,新建一个ActionScript文件,文件名为要创建的类的名字。比如要创建的类的名称为Sample,那么保存的文件名称也要为Sample。注意一定要保存在刚才建立的目录中。•(3)在文件的开头写入package关键字和package包的路径。如:packageTest{},其中Test就是保存类文件的目录名称。•(4)若需要引入其它的类,则需要在package后面的大括号后插入新行,使用import语句加入其它类的包路径和名称。比如importflash.geom.point。若不需要,则此步骤可以省略。•(5)在新的一行写入class关键字和类的名字。如classSample{}。•(6)在class后面的大括号内写入对类定义的内容,包括构造函数,属性和方法。6.2.3创建类的实例•类是为了使用而创建的,要使用创建好的类,必须通过类的实例来访问。要创建类的实例,需要执行下面的步骤:•(1)使用import关键字导入所需的类文件。其用法格式如下所示。•import类路径.类名称;•(2)使用new关键字加上类的构造函数。其用法格式如下:•var类引用名称:类名称=new类名称构造函数();6.2.4包块和类•在ActionScript3.0中,包路径是一个独立的模块,单独用一个包块来包含类,不再作为类定义的一部分。定义包块使用package关键字,其用法格式如下所示。•package包块路径{•//类体•}•用法示例代码:•packagecom.lzxt.display{•//类体•}6.2.5包的导入•在ActionScript3.0中,要使用某一个类文件,就需要先导入这个类文件所在的包,也就是要先指明要使用的类所在的位置。•通过情况下,包的导入有这样的三种情形:•1.明确知道要导入哪个包,直接导入单个的包•例如说要创建一个绘制对象,那么只需导入Display包中的Shape包即可。代码如下所示。•importflash.display.Shape;•2.不知道具体要导入的类,使用通配符导入整个包•例如需要一个文本的控制类,但是并不知道该类的具体名称,那么就可以使用“*”通配符进行匹配,一次导入包内的所有类。具体使用代码如下所示。•importflash.text.*•3.要使用同一包内的类文件,则无需导入•如果现在有多个类位于计算机中的同一个目录下,则这些类在互相使用的时候,不需要导入,直接使用即可。6.2.6构造函数•构造函数是一个特殊的函数,其创建的目的是为了在创建对象的同时初始化对象,即为对象中的变量赋初始值。•在ActionScript3.0编程中,创建的类可以定义构造函数,也可以不定义构造函数。如果没有在类中定义构造函数,那么编译时编译器会自动生成一个默认的构造函数,这个默认的构造函数为空。构造函数可以有参数,通过参数传递实现初始化对象操作。•下面的示例列出两种常用的构造函数代码:•//空构造函数•publicfunctionSample(){•}•//有参数的构造函数•publicfunctionSample(x:String){•//初始化对象属性•}6.2.7声明和访问类的属性•在编程语言中,使用属性来指明对象的特征和对象所包含的数据信息以及信息的数据类型。在定义类的过程中,需要通过属性来实现对象特征的描述和对象信息数据类型的说明。比如在创建一个关于人的类的过程中,就需要说明人这一对象的“性别”特征,需要说明人的“年龄”这一数据的数据类型是一个数字等等。本节将介绍声明和访问类属性的方法。•在ActionScript3.0的类体中,一般在class语句之后声明属性。类的属性分两种情况:实例属性和静态属性。实例属性必须通过创建该类的实例才能访问,而静态属性则不需要创建类实例就能够访问。•声明实例属性的语法格式如下所示。•var属性名称:属性类型;•var属性名称:属性类型=值;•publicvar属性名称:属性类型=值;6.2.8声明和访问类的方法•在编程语言中,使用方法来构建对象的行为,即用来表示对象可以完成的操作。在编程过程过程中,通过对象的方法,告诉对象可以做什么事情,怎么做。比如在创建一个关于人的类的过程中,就需要知道人能够干什么事情,这就是人这一对象的方法。比如人张口说话,举手等等行为,都需要通过方法来表示。•在ActionScript3.0中,声明类实例方法的格式和上面函数的格式类似,格式如下所示。•function方法名称(参数…):返回类型{•//方法内容•}6.2.9类的使用•在ActionScript3.0中,创建好的类一般有3种使用方法:作为文档类进行文档类绑定;作为库中元件的类进行绑定;作为外部类使用import关键字导入。下面结合实例具体的来说一下这3种用法。•1.文档类•文档类是ActionScript3.0的新特色,该特色是为实现代码与文档分离而设计的。•2.与库文件绑定•与fla文件库中的影片剪辑进行绑定,每个影片剪辑只能绑定一个类。•3.import导入类6.2.10包外类•在ActionScript3.0中,一个类文件中可以定义多个类,但是包块内只能定义有一个类,此为主类。主类的名称一定要和类文件的名称相同,这个类是供外部使用的。在包块之外,还可以定义多个类,这些类的名称和类文件的名称不同,而且只能由当前类中的成员可以访问。这种类,有些资料称其为包外类,有些资料称其为助手类。在这里笔者使用包外类这一名称。6.3接口•接口可以看作是一个对象之间相互联系的纽带,起一个桥梁的作用。通过接口中方法声明的集合,能够使互不相干的对象之间相互通信。•接口和类存在着一些类似的地方,也由一定的区别。•接口仅仅声明方法而不提供实现的方法,要实现方法,需要在该接口的类中声明和实现。•接口方法的实现无任何属性,但在接口类的定义中,实现的方法必须为public。•可通过extends语句由接口继承实现多个接口,也可以通过implements语句由类继承实现。•接口是一个定义类方法组的数据类型,可作为类型注释。6.3.1接口的定义•定义接口的方法和定义类相似,不过需要使用interface关键字来实现。•接口可以包含实例方法、静态方法、getter和setter方法。•接口也需要保存为as文件,文件名必须和接口名保持一致,完全相同。•定义接口的语法格式如下所示。•package包路径{•访问控制interface接口名称{•function实例方法名(参数:参数类型):返回类型;•staticfunction静态方法名(参数:参数类型):返回类型;•functionget方法名():返回类型;•functionset方法名(参数:参数类型):void;•}•}6.3.2在类中实现接口•接口只是负责定义一些方法,这些方法要实现,则必须使用接口类来完成。接口类要使用implements关键字来实现。一个类可以实现多个接口,多个接口之间使用“,”分开。同样一个接口可以由多个子类来继承。•下面的示例代码继承上一节中的Iperson接口,并创建子类Man。代码如下所示。•package{•//定义类Man,继承自接口IPerson•publicclassManimplementsIPerson{•//定义类方法walk•publicfunctionwalk():void{•trace(男人走路有力量!!);•}•//定义类方法say•publicfunctionsay():void{•trace(男人说话直截了当!);•}•}•}6.4继承•继承(Inheritance)是面向对象技术的一个重要的概念,也是面向对象技术的一个显著特点。继承是指一个对象通过继承可以使用另一个对象的属性和方法。准确的说,继承的类具有被继承类的属性和方法。被继承的类,称为基类或者超类,也可以称为父类;继承出来的类,称为扩展类或者子类。6.4.1继承的定义•类的继承要使用extends关键字来实现。其语法格式如下所示。•package{•class子类名称extends父类名称{•}•}•下面的示例创建一个新类Man,它继承自Person类,这样Man类就是子类,而Person类就是父类。用法示例代码如下:•package{•classManextendsPerson{•}•}6.4.2属性和方法的继承•子类可以继承父类中的大部分的属性和方法,但是父类中使用“private”访问控制符定义的属性和方法不能被继承。•下面的示例新建一个PC类作为父类,该类有两个实例属性name和age,有两个实例方法walk()和say()。代码如下所示。•创建父类PC,代码如下所示。•packagecom.lzxt{•//构建类•publicclassPC{•//构建属性•publicvarname:String=浪子啸天;•publicvarage:int=30;•//构建方法•publicfunctionwalk():void{•trace(人可以走路!);•}•publicfunctio