




免费预览已结束,剩余42页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三章 ActionScript3 流程控制3.1 什么是面向过程? 看一个找书的例子面向过程:既将一个问题的解决分成一个个步骤,然后按顺序执行。3.2 true和false:条件表达式的结果条件表达式的结果只有true和false组成。条件表达式是由关系运算符或者是关系运算符和逻辑运算付共同组成,例如:A=b、a=b、ab、a=b(ab)&(a!=0)、(ab)|(a!=0)3.3 if-else最常用的控制流程语句:if、ifelse、ifelse ifelse3.3.1 常用的if和ifelseif:判断条件表达式的结果,如果为真则执行流程语句,如果为假则不执行流程语句。Ifelse:判断条件表达式的结果,如果为真则执行流程语句1,如果为假则执行流程语句2。另外当流程语句仅为一条语句时可以省略大括号。3.3.2 ifelse ifelse的用法和注意点就是在一个ifelse语句后紧接一个ifelse,需要注意如果第一个条件表达式为真,那么后面ifelse语句就不会再被执行了,所以应当把精确范围小的条件表达式提前。3.4 循环在编程中循环和判断是经常用到的,循环语句有:while、dowhile、for、forin、for eachin。其中while、dowhile、for在AS和其他编程中已经存在,forin在AS1和2中就已经存在,for eachin是AS3中新加入的。3.4.1 循环的三要素首先确认循环体,即需要重复做的事情其次确认循环变量,循环变量是用来控制循环的开始与结束。最后确认循环三要素:1、 循环变量,并且初始化2、 循环条件表达式:表达式为真则执行循环,反之则不执行循环3、 循环体中必须有改变循环变量的语句。3.4.2 whileWhile的中文意思是当的时候,即当循环条件表达式为真时开始循环。While (循环条件表达式) 循环体;3.5.3 dowhileWhile是先判断循环条件表达式再决定是否运行循环体,而dowhile则是先运行一次循环体再判断循环表达式决定是否继续循环,也就是说,会至少运行一次循环体。Do 循环体;While (循环表达式);3.5.4 forFor (初始化循环变量;循环条件表达式;步进) 循环体;步进(step)既每次循环之后对循环变量的操作。也可以将循环变量、循环条件表达式、步进从括号抽取出来放入循环体,例如:Var i:int = 0;For ( ; ; ) 流程表达式I+;If (!(i5)retuen;3.5.5 forin和for eachin集合:array(普通数组)、Object(关联数组)枚举:既挨个访问集合中的每一个元素。可枚举属性大多都是动态属性。Forin、for eachin的由来主要是为了查找object对象内的键或者成员,因为在array中可以通过索引或者数组长度来查找某一个元素,而object中都是动态属性。Forin是用来遍历一个object的键,它的变量代表成员的名字。Var o:Object = new Object (a:“111”,b:“222”)For (var I in o)Trace (输出内容)For eachin是用来遍历一个object的成员,它的变量代表成员。For each (var I in o) Trace (输出内容)3.4.6 break和continue在循环体中,使用break既表示跳出循环,循环就此停止。而使用continue既表示跳过此次循环,循环将从下一次循环开始。3.4.7 控制嵌套循环的流程:break和continue的标签用法在嵌套循环当中,不用标签的话只能跳出或者跳过当前循环,但使用标签则可以让例如自循环中的break或者continue去跳出或者跳过父循环,例如:Parent: /标签While (true) For (var k:int = 0 ;k5 ;k+ ) Continue parent;Break parent;3.5 switch所表达的意义和ifelse一样,但是在某些情况下面用switch较为简洁明了。Switch (需匹配的参数) Case 用于匹配的参数:执行语句;Break;Case 用于匹配的参数:Default :执行语句;需匹配的参数和用于匹配的参数比较是所用的是全等运算符,这就意味着它不能调用强制类型转换,因此参数的类型需要一样。关于break:当参数匹配上一个某一个case时,会将这个case以后的执行语句都执行,直到执行过default的执行语句为止,如果需要对执行的语句进行控制,就必须适当的使用break或者return来终止。第4章 ActionScript3中的函数及高级使用技巧函数:是执行特定任务并且可以在程序中重用的代码块,其内部包含着至少一条或数条语句,可以接受外部传入的对象也可以返回操作的结果函数分为两类:方法(method)和函数闭包(function closures)4.1 两种定义函数的方法函数有两种定义方法:一种是函数语句(function statement),另一种是函数表达式(function expression)4.1.1 函数语句定义法Function 函数名 (参数1:数据类型,参数2:数据类型):返回类型 函数内部语句4.1.2 函数表达式定义法Var 函数名:function = function (参数1:数据类型,参数2:数据类型):返回类型 函数内部语句既先定义个function类型的变量,再将函数赋值给这个函数变量。4.1.3 两种定义法的区别和选择在编译器编译方面,函数语句定义法定义的函数会被编译器自动提升,而函数表达式定义法定义的函数则需要先定以后才可以使用。在this关键字记忆方面,函数语句定义法定义的函数它的this关键字会牢牢的锁定在当前域,而函数表达式定义法定义的函数则会随着它所属的域或者对象的改变而改变this关键字的记忆。并且函数表达式定义法定义的函数可以被apply()和call()改变它所属的域或者对象,而使用函数语句定义法定义的函数则不可以。4.2 参数4.2.1 按值还是按引用来传入参数ActionScript3中所有传参所传入的都是对象的引用,不过因为基元数据类型是不变对象,所以如果传入的参数是一个基元数据类型,他的效果和传入值是一样的,如果是复杂数据类型,那么传入的则是对象引用。4.2.2 设置默认参数可以为函数设置默认的参数,如果在调用函数的时候没有为这个函数传入参数,那么它就会使用默认的参数来替代:Function abc (a:int=1,b:int=2,c:int=3) Trace (a+b+c)+a+b+c);4.2.3 访问参数信息和(rest)关键字在函数中传入的参数都会被保存在自动生成的一个arguments对象中,这个对象类似数组,他有2个属性,length和callee(),length保存传入的参数的个数,而callee()持有这个函数的引用,可以用来改变参入的参数,需要访问这个函数中的参数时在函数内部使用arguments来访问即可。在AS3中不能像AS2那样可以传入任意多的参数,但是为了满足这样的需求可以使用(rest)关键字来达到传入任意多参数的目的,其中rest可以任意改变名字:Function abc (test) Trace (test.length)For (var I in test ) trace (i);Abc();注意:此时arguments已经不能使用,将由test来代替他!4.3 函数的本质4.3.1 函数语句定义法定义的函数对象本质用函数语句定义法定义的函数其实是内置的methmodClosure(函数闭包)类的对象,这个methmodclosure类的父类是function类,并且methmodclusure类不是动态类,而这个定义的函数既是function类型也是Object类型,因为function类直接继承Object类。4.3.2函数表达式定义法定义的函数对象本质用函数表达式定义法定义的函数并不是methmodclusure类的对象了,而是function-1的对象,而这个function-1类是在编译时生成的function类的子类,如果有多个函数用函数表达式定义法定义,那么还会看见function-2、function-3依此类推,这个生成的function-1类是动态的,因此可以使用高级函数运用技巧。4.4 函数高级使用技巧函数 是 对象4.4.1 技巧一:代理函数对象首先创建一个function类型的对象,但是并不将函数的引用赋值给他,而是根据情况赋值给它相应的函数。Var a:function;Var b:String = “boy”;(b=”boy”)?(a=boy): (a=girl);Function boy () trace (“I am a boy”);Function girl () trace (“I am a girl”);4.4.2 技巧二:建立函数执行队列可以将多个函数加入到一个数组对象中,然后使用循环来控制函数使用的顺序。也可以扩展用另外一个数组来改变这个函数使用的顺序。4.4.3 技巧三:利用函数返回函数创建一个函数根据情况来选择所需要的函数,在这个用于选择函数的函数中可以使用if和switch语句来匹配不同传入的参数然后返回相应的函数。ChooseFuncBy (传入选择函数的参数)(传入返回函数的参数)4.4.4 技巧四:函数动态添加实例属性在使用函数表达式定义的函数时,因为这个函数时自动生成的function-1的对象,而且这个类是动态的并且函数也属于Object类型,所以可以在这样的函数中动态添加一个属性,可以用来记录这个函数运行的次数,而访问这个动态添加的属性时必须使用:函数名属性名 来访问。并且注意不要再函数内部初始化这个属性。4.4.5 技巧五:函数对象动态添加实例的方法在技巧4当中添加的成员属性是一个值,而且在Object对象中,他的成员也可以是一个方法,那么技巧五中就是添加了一个方法来处理这个为值的成员属性。第二部分 ActionScript3面向对象编程第五章 类和对象-从定义到原理5.1 第一个ActionScript3 简单的Class例子Package Public class hello Public Var helloString:String = “world”;Public function hello () Public function sayHello ():void Trace (“hello“+helloString+”!“);一个class要想被外部访问就必须放在一个package中,并且用访问控制关键字public来控制类成员的访问权限,在一个package中只能有一个class,但是在同一个.as文件中,package外可以有多个class,这样的类叫做包外类,在class中定义的变量叫做属性,在class中定义的函数叫做方法,与类名相同的函数时一个特殊的函数,称为构造函数。用统一建模语言描述上面的代码:Hello+helloString:String+hello()+sayHello()第一行粗体字表示的是类名,第二行表示的是属性,“+“符号表示的是public访问权限,第三行表示的是方法。5.2 class和objectClass是用来描述否个物体他所拥有的特性和一些行为的模板,而object是依照这个模板所生成的具体物件,此时这个具体物件就叫做这个模板的实例,也可以说是这个模板的对象。5.2.1 class和object的权威定义对象的定义:一个对象他具有自己的状态、行为和唯一标识,所有相同类型的对象他们所具有的结构和行为在他们共同的类中被定义。对象的状态:包括对象已有的属性(类中定义好的)和 当前属性值(一般为动态属性)行为:指一个对象如何影响外接和被外接影响,表现在自身状态的改变和信息的传递。标识:指一个对象所具有区别于其他对象的属性(一般是指对这个对象的引用)。类:一个类就是一群对象所共有的结构和行为,一个对象对外部开放的属性和方法被称为对外部的界面接口,简称外部接口。5.2.2 class和object的区别Class相当于语言中的名词,他描述一类事物,而object相当于这类事物的一个实体,不但具有class所描述的一系列特征,还有他自己特有的特征。5.3 class的成员Class的成员包括:Class的名称以及包路径Class的构造函数Class的属性(包括实例属性和静态属性)Class的方法(包括实例方法和静态方法)Class和其成员默认的访问控制权限为internal,既包内可见。5.4class和object的创建和使用5.4.1-5.4.2 创建class的实例在项目目录下建立.as文件,次文件命名应和类名相同,之后再文件第一行写入package关键字和包路径,在package的大括号内用import调用所需要的别的包里面的类和类名,没有也可不写,之后用class关键里创建类,在类的大括号内定义这个类。5.5 class和packagePackage 包路径 Public class 以大写字母开头的类名 静态属性静态方法实例属性构造函数实例方法5.6 实例属性和实例方法实例属性:以变量的形式出现,定义在类中实例方法:以函数的形式出现,定义在类中,分为内部方法和外部方法,内部方法用于类内部成员互相协作的内部逻辑,而外部方法就是告诉外界这个实例可以做些什么。5.6.1-5.6.2 如何声明实例属性和实例方法声明实例属性:访问控制符 var 变量名:数据类型;可以在声明时赋值也可以不赋值,但是不能将表达式赋值给实例属性。声明实例方法:访问控制符 function 方法名(形参):返回类型 访问控制符 var 方法名:function = function (形参):返回类型 此方法也可以只定义一个function类型的变量,不给他赋值。5.6.3 如何访问实例属性和实例方法必须在创建一个实例后才可以访问实例属性和实例方法,因为这个时候才会有实例属性的值,实例方法才会和这个实例绑定。在访问的时候可以使用”.”运算符也可以使用”数组运算符,一般使用点号运算符,在不确定访问哪种实例属性和实例方法的时候才用数组运算符。数组运算符内一定要是String数据类型。5.7 静态属性和静态方法静态属性和静态方法是独立于所有实例的,可以在不创建实例的情况下被调用,并且他们在类被创建的时候指创建一次,与创建多少次实例无关,变动一个实例的实例属性只对这个实例造成影响,而变动一个静态属性则会对所有实例造成影响。5.7.1 静态属性和静态方法的使用场合静态属性和静态方法的共同特点就是,不需要专门为这个类创建一个实例就可以使用,静态属性主要用于数据的统一存储,静态方法用于做一些特定的运算,例如math类。5.7.2 声明静态属性和静态方法声明静态属性:Static var 变量名:数据类型;Static var 变量名:数据类型 = 值;Public Static var 变量名:数据类型;Public Static var 变量名:数据类型 = 值;声明静态方法:Static function 方法名:数据类型 ():返回类型 Public Static function 方法名():返回类型 Static var 方法名:function = function ():返回类型 Public Static var 方法名:function = function ():返回类型 声明静态常量:Static const 变量名:数据类型 = 值;注意:声明静态常量必须赋值。5.7.3 访问静态属性和静态方法在类中可以直接访问静态属性和静态方法,但是在类外就必须使用类名.属性名或者类名.方法名来访问,但是在类中最好也使用这个方法访问,因为静态属性和静态方法不能通过实例来访问,如果有同名的实例属性和实例方法,那么实例属性和实例方法会遮蔽掉静态的属性和方法。5.7.4 应用1:使用静态属性集中管理数据可以将一组无意义的数字或者字符串有用意义的名字作为静态属性定义在一个类当中,这样便于代码的阅读。5.7.5 应用2: 使用静态属性部分实现enumerationenumeration也有集中管理的好处,但是他比应用1要纯粹一些,没有什么逻辑方法。当需要区分静态属性的状态的时候,可以给他们分别建立一个enumeration类的实例,这时候他们所持有的引用都不一样,达到区分的目的。5.7.6 应用3:实现工具类即将一些静态的方法写在一个类中,形成工具类,这样只要根据类名.方法名()就可以随时随地调用这些方法。5.8 构造函数构造函数的函数名和类名一致,都是首字母大写,在创建对象的时候编译器自动调用构造函数。5.8.1 构造函数的实例5.8.2 构造函数只能使用public访问控制如果在编写构造函数的时候没有设置访问控制,那么编译器会自己设置为public,除public以外的所有访问控制都不能用在构造函数5.8.3 构造函数的返回类型构造函数没有任何返回类型,可以在构造函数中使用return作为流程控制,但不可以返回值或者表达式5.9 class的种类:动态类和密封类只有动态类的实例才可以动态添加属性和方法,并且forin和for eachin只可以遍历动态类的动态添加的属性。5.10 this关键字This关键字存有当先对象的引用,一般用的地方不多。以下情况会用到:1、 在给第三方工具类传递当前对象的引用时用。2、 结合return关键字返回当前对象的引用时用。3、 在与局部变量、方法参数、静态属性有重名的时候使用。5.11 ActionScript3中的方法重载在AS3中不支持方法的重载,但是我们可以使用rest关键字来变相实现。即通过带有rest关键字的方法来判断传入的参数,并且返回给相应的其他方法,最后由其他方法返回最终结果。5.12 含有多个类的ActionScript3类文件的标准例子类文件是个以.as结尾的纯文本文件,一个as文件中,每个package大括号内只能有一个class,这个class必须与文件名同名,在package大括号外可以有多个class甚至是可执行语句。第6章 ActionScript3中的封装:OOP编程三要素:封装、继承、多态封装包括:类成员的访问控制、包和类的访问控制、命名空间的使用。6.1 什么是封装封装即是将必要的功能接口对外公开,而隐藏自身的实现逻辑,而调用者只需要知道这个功能接口能实现哪些功能,并不用知道是怎么样实现的。使用访问控制符实现封装:public、protected、internal、privite。6.2 为什么需要封装6.2.1 封装使修改代码更加容易和安全封装使得外部只能调用一些必须的功能性接口,这样就能避免修改到一些被调用的方法或者成员。封装可以避免命名冲突,包封装可以避免2个不同包中的类命名冲突,类封装可以避免2个不同类中的方法命名冲突。6.2.2 封装让代码分成一个个相对独立的单元最小的单元是一个类,但是一般一个单元中包含多个类,共同合作完成一项任务。代码单元又称模块,往往是一个一个的包,一个程序就是由这样的多个模块组成。在修改程序时只要保证每个模块对外的接口不变,其内部就可以自由修改甚至重写。6.2.3 封装让整个软件开发的复杂度大大降低在“黑箱”理论中,把一个模块比喻成一个黑箱子,他只有对外的属性和方法,而程序员通过这些方法和属性与对象交道,不用考虑他的实现过程,只需要打好框架,确定好每个模块,最后让他们互相写作即可。6.3 封装的几个层次AS3中支持的封装层次从最开放到最隐蔽为:包外、包、类以及包外类、包外:用public定义,指包外的任何人都可以访问。包:用internal定义,指只有在同一个包内部的成员可以访问。类:用privite定义,指只有在同一个类中的成员可以访问。包外类:在一个编译单元AS文件中package外部定义的类,只能在这个AS中被访问,可以看成这个编译单元的私有类。在AS3中默认的访问控制为internal。6.4 package包是划分访问控制的一个重要界限,包是一个逻辑单元,它包含多个有逻辑联系的类,共同对外提供一个或者多个服务。全饰名称:是包含包路径的类名。6.4.1 包的导入(import)在使用一个外部的类之前需要用import关键字用全饰名称导入这个类,才可以直接使用这个类的类名。注意:在AS3中,即使用全饰名称来使用这个类,也需要用import关键字事先导入。当创建的这个类是别的包中的类的子类的时候,也需要使用全饰路径导入这个包。如果使用的多个类都在一个包中,也可以使用“*”导入整个包中的类。当需要使用的类在同一个包当中,就不用导入,直接就可以使用。6.4.2 用import避免命名冲突在工程当中,因为多人合作难免有类命名冲突的时候,这时候就需要把它放在不同的包中,在使用的时候用import导入这个类的全饰路径,就可以准确的访问到这个类。如果2个同名类都需要被导入使用,那么在使用的时候也需要用全饰路径。6.4.3 package的创建和命名在日常编程当中,包名称也有可能有命名冲突,解决办法如下:1、 为这个包创建上层包路径,这样防止同名的包在相同的路劲当中。但是无法根本解决。2、 用域名倒写作为包路径例如:cn.njkh.*3、 也可以用名字作为包路径,例如:jiang.qu.*注意:包路径需要和在系统中的文件路径一致,例如:d:cnnjkh当系统中的文件路径发生更改之后还需要将package的包路径更改。6.5 编译器如何导入package一个包中有自己的类,在包中也可以放置包,称为子包,子包中也有他自己的类。Class写在.as文件中,.as文件放置在文件夹中,这个文件夹就对应这个包。所有的包又都放在指定的class path 中。6.5.1 类路径类路径即编译器查找包的开始路径,例如将类路径定义成d:test,那么在查找cn.njkh.*这个包的时候就会从d盘下面的test文件夹开始查找。Fla和mxml文件都有默认的类路径,为文件所在的目录。6.5.2 package导入的顺序先查找fla所在的目录中是否存在这个包,如果没有就查找下一个类路径,直到所有定义的类路径都查找完后依然没有找到,那么编译器会报错。6.6 类成员的访问控制AS3中的访问控制符共有4个:public、privite、protected、internal,他们都是通过AS内置的name space来实现的,也可以自己通过name space定义自己的访问控制符。访问控制符既可以控制类,也可以控制实例属性、实例方法、静态属性、静态方法。6.6.4 internal 包内可见在同一个包中的其他类可以互相访问,但是在这个包之外的就不能访问。6.6.5 public 完全开放使用public访问控制的类或者方法以及成员可以被任何地方使用,但是一旦使用public就代表对外界的承诺,不可以随意修改,如果发现一个类或者成员频繁的被外部使用,就需要考虑是否将他们独立出来,一般先考虑internal再考虑public。6.6.6 privite 仅当前类可以访问使用privite定义的成员只能在这个类累不被访问。但是如果这个成员是复杂数据类型,那么并不代表他所持有的引用所指向的对象不能被访问。6.6.7 Protected子类可访问使用protected定义的成员只有这个类的子类可以访问。6.7 getter和setter方法Getter和setter从本质上来说是一个实例方法,但是对用外部使用者来说他只是个属性Getter和setter也变相的实现了一些访问控制的作用,getter可以将一个属性变相成为只读属性,setter可以将一个属性变相成为可修改属性,但不可读。并且,他们在可以添加别的语句,更加的灵活。Getter方法定义:Public function get abc ():返回数据类型 其他方法;Return 返回的引用;Setter方法定义:Public function set abc(参数:数据类型):void 其他方法;赋值语句;Getter方法一定要有返回语句,并且要与成员类型一致。Setter方法一定要有参数和复制语句。6.8 类的访问控制类只有public和internal这两种访问控制权限6.9 包外类在一个.as文件中在package之外可以有任意多的类,如果包外类的名字和包中其他类的名字重名,那么包外类优先被调用。包外类对外部完全不可见,只允许这个AS文件当中的类访问。为什么实现单例模式和包外类有关?第七章 命名空间7.1 命名空间的简要解释命名空间可以自定义类成员对外部的可见性。7.1.1 命名空间与一词多义命名空间用来区分同样一个词在不同环境下所要表达的意思。7.1.2 第一个命名空间代码的例子使用 namespace 命名空间名 创建命名空间,在用命名空间定义方法的那个类之前。用 命名空间名 function 方法名 () 来创建带命名空间的方法。在使用这个命名空间的方法时:1、 可以先使用 use namespace 命名空间名 打开命名空间,然后通过实例直接调用。2、 也可以使用 实例名.命名空间名:方法名()来直接调用。 7.1.3 命名空间无处不在类中的成员都由 命名空间+成员名 组成。Public、protected、internal、privite本质上都是命名空间,他由AS3语言内建的。7.2 使用命名空间的流程命名空间可以定义在包外、包内类外、类内、方法内。命名空间可以应用于实例属性、实例方法、静态属性、静态方法。定义命名空间时可以加上访问控制符:public namespace abc。命名空间有两种使用方法:1、 使用 use namespace 命名空间名 打开命名空间。a) 命名空间只能打开不能关闭b) 在打开一次命名空间后,命名空间的作用域就可以使用这个命名空间下的所有属性和方法2、 使用命名限定符“:”来调用命名空间内的成员。a) 实例名.命名空间:实例属性;b) 实例名.命名空间:实例方法();c) 类名.命名空间:静态属性;d) 类名.命名空间:静态方法();7.3 命名空间的本质命名空间由namespace类来实现,这个类只有2个属性,prifix和uri。Uri(统一资源定位符)是一个String类型,他存储namepace的名字,因此命名空间不会出现重名的情况。7.3.1 命名空间的唯一性命名空间是按照他的uri值来区分的,保证他不重复的方法有2中:1、 付给uri一个独一无二的值,一般用URLa) Public namespace 命名空间名=“URL”2、 使用系统自动生成a) Namespace 命名空间名一般的情况下使用系统自动生成的就可以,如果需要加一些版本信息,那么可以使用第一种方法。7.3.2 系统如何生成命名空间的默认URI1、如果定义在包内,包名:命名空间名2、定义在类内,包名:类名/命名空间的访问控制权限:命名空间名。3、定义在方法内,包名:类名/访问控制权限:方法名/包名:命名空间名。7.4 如何定义命名空间1、如果想被不同包中的类文件使用,就定义在包内。2、如果只是在类中被使用,那么就定义在类内。7.4.1 将命名空间定义在独立的.as文件中在一个包中创建一个与命名空间名相同的AS文件,然后将命名空间定义:创建名为qujiang.as的AS文件Package Public Namespace qujiang = ;7.4.2 命名空间定义在类中在类中定义的命名空间是属于这个类的静态属性。7.5 如何应用命名空间在成员前面加上命名空间名即可,本质上是将这个成员放入这个命名空间中,一旦放入那么这个成员就相当于privite,对外不可见,只有引用这个命名空间后才可以访问。7.6 如何引用命名空间1、使用use namespace 打开命名空间。2、使用命名限定符“:”引用。7.6.1 打开命名空间命名空间一旦被打开就无法关闭,可以打开多个命名空间,但是如果在打开的多个命名空间中有相同名字的属性,那么就需要使用命名限定符在明确引用哪一个命名空间的属性,否则会被人为模糊引用而报错。打开命名空间的语句会被编译器提前执行,就是说不管代码写在哪里都会在所有代码运行之前打开,那么也就以为着它不会受上下文的影响,例如if语句。7.6.2 使用命名空间名称限定符“:”当命名空间被定义在一个as文件中,那么不管是使用命名空间名称限定符应用命名空间还是引用命名空间,都必须在类定义之前有use namespace 命名空间名,这样是为了在调用的时候让FVM初始化命名空间对象。当定义在类中时,他是作为类的一个静态属性,所以必须通 过类名.命名空间 名来调用7.6.3 自定义命名空间和public、protected、internal、privite2个自定义命名空间中可以有同名的属性,而内建的不可以。自定义命名空间可以使用命名空间名称限定符在访问属性,而内建的不可以。7.7 命名空间有哪些实际应用1、防止命名冲突2、实现灵活的访问控制3、实现不公开的API第八章 复合和继承复合和继承的核心思想就是代码的重用。8.1 如何实现复合复合就是在新创建的类用有一个或多个对象,这些对象是现有类的实例。OOP编程优先考虑复合。8.1.1 一个复合的例子见P1468.1.2 初始化复合的对象1、在定义属性时就初始化被复合对象(饿汉式初始化)此方法保证被复合对象一定会被初始化,缺点是浪费资源2、在构造函数中初始化被复合对象只有当复合对象被创建的时候才会初始化被复合对象。3、 在相应方法中初始化被复合对象(懒汉式初始化)只有在要用到的时候才会初始化被复合对象,需要事先判断变量是否已有引用,有点是节省资源。8.1.3 复合与聚合的区别相同点:1、 都是在新类中持有别的类的对象。2、 复合对象和聚合对象都是新类的对象,被复合对象和被聚合对象都是现有类的对象。不同点:1、 被复合类对象随着复合类对象的创建而创建,复合类对象消亡了,被复合类对象也消亡。被聚合类对象不一定随着聚合类对象的创建而创建,聚合类消亡了,被聚合类对象的引用也可能被第三方持有。2、 被复合类对象的引用不会暴露给外部,而被聚合的对象可以被外部引用。3、 被复合类对象与复合类对象“同生死“,被聚合类对象与聚合类对象”各安天命“。8.2 如何实现继承新类看起来与原有类相似,新类有原有类的所有非private实例属性和方法,在使用原有类对象的地方都可以使用新类的对象。被继承的类称为:基类、超类、父类。用继承创建的类称为:扩展类、子类注意:在继承之前需要导入父类,用extends创建子类。并且AS中的继承为单继承,即子类的父类只允许有一个。8.2.1 创建自定义类与as3默认的继承在AS3中所有的内之类都直接或者间接继承与object类,当我们创建了一个自定义类并且没有指定他所继承的类是,默认继承与object类。8.2.2 继承的实现和一个具体的例子P1528.2.3 静态成员的继承父类的静态成员不能被子类继承,但是子类可以直接访问父类的静态成员。如果子类的实例成员或者静态成员的名字与父类的静态成员名称有冲突,那么父类的静态成员就会被遮蔽,只能通过父类的类名来访问。如果在某些时候必须使用子类的类名来访问父类的静态成员,那么可以在子类定义一个与父类同名的静态成员,并且调用或者将父类的静态成员的值赋给子类的静态成员。8.2.4 继承与访问控制当父类的成员需要对外部和子类公开的时候可以使用public当父类的成员不需要对外公开或者确定他和子类都在同一个包中的时候使用internal当父类的成员不需要对外公开,但是和子类不在同一个包中的时候使用protected当父类的成员不需要对外部和子类公开的时候可以使用private注意:当父类和其子类不再一个包中,但是又需要对父类所在包的其他类公开,且又不能为public时,只有通过自定义命名空间来实现。8.2.5 继承和重写子类只能重写父类的实例方法,不能重写父类的实例属性,其目的是保证父类的实例属性的数据类型不被改变,如要只是需要改变父类实例属性的值,那么可以将父类实例属性定义在一个方法中,子类通过重写这个方法来改变父类实例属性的值。父类中被final关键字或者private定义的实例方法不能被重写。子类重写父类实例方法的时候,访问控制、方法名、参数个数、参数的数据类型、返回的数据类型必须相同,但是参数的名字可以不同。8.2.6 继承和私有方法:易错的误区父类的私有实例方法和子类的私有实例方法是相互独立的,即使是同名也不会互相影响,如果父类的一个实例方法调用了父类的私有方法,之后被子类继承,那么在子类的实例运行这个方法的时候调用的依然是父类的私有实例成员,如果想让其调用子类的私有实例成员就必须使用override重写这个方法。8.2.7 继承与super关键字Super关键字可以看作是一个持用父类引用的变量,当在子类中需要重写父类方法,但是仅仅一些增加时,可以用super关键字来将父类的方法导入,super()表示父类的构造函数。8.2.8 用final终止继承Final关键字放置于类定义语句前,表示这个类不可以被继承或者被扩展。Final关键里放置在非private实例方法之前,表示这个方法不可以被子类重写。8.2.9 何时使用final主要用于:类的设计和代码的执行效率用于类时可以防止这个类是最后一个类,因此可以公开的成员设置放开一些手脚。用于实例方法是可以保证实例方法在子类的一致性。8.3 自定义命名空间的继承父类的命名空间成员也会被子类继承,即在打开命名空间以后,用子类实例即可访问到命名空间成员。8.4 何时使用复合,何时使用继承谨慎使用继承,在需要向上转换的时候使用继承,有is-a关系的时候使用继承,而是has-a关系的时候使用复合第九章 多态一个实例对象他即是自己的数据类型,也可以是父类的数据类型,也可以是所实现接口的数据类型。AS3中所有的类都是多态的,因为他们直接或间接的继承自object类。9.1 数据类型检查和转换在AS3中使用is关键字检查对象是否属于某个数据类型,返回ture和false。使用as关键字检查对象是否属于某个数据类型,如果确实是这个数据类型,那么他会返回这个数据类型的引用,并且把这个对象当作是这个数据类型,如果不是那么返回null。9.2 向上转换一个子类对象可以被当成他的父类对象来使用,即为向上转换9.2.1 简述里氏代换原则使用父类对象的地方都可以替换成其子类对象。想上转换是里氏代换原则的前提。里氏代换原则标准描述:在一个程序中,将所有类型为A的对象,替换成类型为B的对象,程序行为不受影响,那么类型B就是类型A的子类。注意:这里类型不单指类,还有接口9.2.2 向上转换代码的例子P1689.3 向下转换向下转换是不安全的,当一个对象只是父类的对象而不是子类的对象,那么向下转换是不程控的.9.3.1 向下转换的两种方法父类对象 as 子类类型;as关键字转换子类构造函数(父类对象);显示强制转换使用as关键字转换时如果类型不合就会返回NULL。使用显示强制转换时如果类型不和就会抛出TypeError异常。9.3.2 向下转换代码的例子P172第十章 抽象类和接口10.1 什么是抽象类抽象类即不能被实例化的类,他只是将多个物件的共同点集合在一起。9.3.2的例子中,图形的父类KingdaShape就是形式上的抽象类,而方法draw()即形式上的抽象方法,因为这个方法是空的,是用来被子类重写的。10.1.1 使用抽象类的原则1、抽象类中尽可能多的包含子类的共同代码2、抽象类中的数据能少则少,子类的状态数据时不应该存放在抽象的父类中。10.1.2 使用抽象类的例子例如as3的显示架构设计,就是很好的一个使用抽象类的例子。10.1.3 如何使用as3真正实现抽象类和抽象方法目前AS3还不支持抽象类和抽象方法,需要用第三方软件实现例子:P17810.2 什么是接口从实际意义来说:接受包含一组方法的声明,没有具体的代码实现,实现接口的类必须实现它所有的方法,接口类似一个协议,描述了实现接口的对象对外部的承诺。从语法上来说:接口只实现了public方法的名称、参数、返回值,并不对其做出实现。从运用中来说:接口可以让多个没有任何关联的类使用同一种数据类型,前提是他们都实现了这个接口。10.2.1 接口是OOP编程的重要基石依赖倒转原则:做任何代码的实现,首先要依赖于抽象的实现。要根据接口来编程,而不是根据实现来编程。10.2.2 如何创建接口创建接口的格式:Internal interface 接口名 1、定义接口的关键字为interface2、接口的默认访问控制为internal,可以为public3、接口中所有的方法不可以加访问控制符,默认为public4、接口中所有的方法都不可以实现。5、接口中不可以定义属性,只能定义实例方法、静态方法、getter方法、setter方法。6、接口的首字母以大写的I开头7、定义接口和定义类一样,需要在一个.as文件中定义,并且接口名和文件名一样。10.2.3 如何实现接口继承时用extends实现,而实现接口时用implements实现,并且在实现前需要先导入接口,格式为:Public class 类名 implements 接口A,接口B,接口C 在导入多个接口时要注意他们中的方法不能重名,否则会引起冲突实现的接口中的方法访问控制都为public实现的方法和接口中的方法,方法名、参数数量、参数类型、返回值都必须相同实现的方法和接口中的方法参数名和参数的默认值可以不相同。例子有错:P182 在文档类中也需要导入接口,否则报错找不到数据类型。10.2.4 接口与多继承、向上转换、向下转换P18510.2.5 接口的继承接口支持多继承,子接口会继承所有父类的方法,但是一定要注意方法中没有重名。接口继承中没有override机制,因为接口中的方法都没有被实现,根本没必要。10.2.6 接口类型多方法接口:一个接口内定义了一个以上的方法单方法接口:一个接口内只定义了一个方法标识接口:接口中没有方法,这个技巧是用来将2个完全不相同类型对象联系起来用的。10.3 抽象类和接口的区别抽象类和接口都可以简称为抽象类型抽象类是一个类,接口不是一个类,抽象类在必要的时候可以部分实现类中的实例方法,而接口中的方法就必须留空。抽象类只能单继承,这就意味着,一个类对象不能作为多个类型使用,他只能作为自己本身类的类型、以及他父类或者间接父类的类型。而接口可以多继承,完全可以满足类对象作为多个类型使用的需求。对于已存在的类需要添加抽象方法的需求,使用接口比使用抽象类要稳健、简单。10.3.1 何时使用抽象类,何时使用接口在单纯的为具体类添加抽象类型时,优先采用接口,因为他不会改变具体类的继承接口。如果需要将多个具体类的共同点实现集中管理时优先使用抽象类。也可以将接口在抽象类中实现。一般情况下优先考虑接口10.3.2 将接口和抽象类结合使用充分利用了抽象对子类的影响,接口中的方法只需要在抽象类当中实现,子类就可以使用,而当接口中的方法发生改变的时候,只
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广东省肇庆市高中英语 Unit 5 Canada The True North Writing说课稿 新人教版必修3
- 物理中级职称考试题型及答案
- 餐饮店卫生管理及检查评分标准
- 企业资产固定物品移交清单
- 股权方案设计咨询
- 六年级上册语文课外阅读训练题
- 企业员工关怀与激励管理实施方案
- 东莞银行笔试题目及答案
- 陕西网络主题活动方案策划
- 项目招投标文件编制实务指导
- 医院医患纠纷处理课件
- 2025-2026学年人教鄂教版(2024)小学科学三年级上册教学计划及进度表
- 医院药品不良反应培训
- 镇痛类药物应用与管理规范
- 休克患者急救
- 2025年工行客户经理测试题及答案
- 大宗商品交易管理办法
- 普通话宣传教学课件
- 2025年广东省中考英语试题卷(含标准答案)
- 2025年郑州市社区工作者考试试题集
- 创新联合体建设管理办法
评论
0/150
提交评论