龙图教育:AS3方法和技巧(4)

2020-05-07 09:10

protected var protNum:Number = 2;

// private access granted only in this class private var privNum:Number = 3;

// internal access granted only in the same package internal var interNum:Number = 4;

// constructors are always public function Bowl() {

// can access inteneral classes if in same package var basket:Basket = new Basket();

trace(basket.pubNum); // OK

// trace(basket.protNum); // Error - cannot access protected // trace(basket.privNum); // Error - cannot access private trace(basket.interNum); // OK - same package

// clone using public method

var basketCopy:Basket = basket.clone(); } } } 4.

package containers {

// interal only accessible

// from other classes in package internal class Basket {

// public access granted anywhere public var pubNum:Number = 1;

// protected access granted only for // subclasses in that class

protected var protNum:Number = 2;

// private access granted only in this class private var privNum:Number = 3;

16

// internal access granted only in the same package internal var interNum:Number = 4;

// constructors are always public function Basket() { }

// accessible anywhere as long as // referencing a Basket instance public function clone():Basket { var basket:Basket = new Basket(); basket.pubNum = pubNum; // OK

basket.protNum = protNum; // OK - same class basket.privNum = privNum; // OK - same class basket.interNum = interNum; // OK return basket; } } }

19. 抽象类

20.override关键字 21.prototype的用法 22.正则表达式

19.抽象类

AS3仍然不支持抽象类(不能示例化,只是用来派生其它类),译者注:在c++,C#,java中都有抽象类.

所以在AS3中不能自己定义抽象类,但有一些internal类具备抽象类的作用.

DisplayObject InteractiveObject

DisplayObjectContainer

同使用抽象类一样,不能用new关键字来直接创建这些类的实例.下面AS是错误的.

var myObj:InteractiveObject = new InteractiveObject();

同抽象类不同的是,AS3中的这些类,不能直接从它们继承,也不能创建它们子类的实例.同样,下面的AS也是错误的

package {

import flash.display.DisplayObject;

17

public class MyDisplay extends DisplayObject{ public function MyDisplay (){ // ERROR } } }

这和internal的性质和上述类在Player中的定义方式决定的,不管是创建子类继承上述类,还是创建子类的实例,都会和直接创建上述类的实例一样,产生相同的”Argument Error “. 正确的作法是:先创建上述类的internal类型子类,再继承子类.如,要创建一个继承DisplayObject类的子类,可以从Shape类继承.(shape类是DisplayObject类的一个简单internal型子类).

20.override关键字

重新定义类中继承自父类(或超类)的函数或者属性,也叫覆写,直接调用时,新的函数会覆盖父类(或超类)的函数.但仍可以通过super关键字来调用父类(或超类)的函数.

AS3中覆写父类(或超类)的函数(或方法)或者属性,需要用override来标识新函数(或方法),来说明它是重新定义的继承自父类(或超类)的函数.如果不用override标识重载的函数,程序在编译时会出现错误.

package {

import flash.display.*;

class MySprite extends Sprite {

private var children:Array = new Array(); public function MySprite() { }

public override function addChild(child:DisplayObject):DisplayObject { children.push(child); super.addChild(child); return child; } } }

因为addChild()函数已经在Sprite类中定义,覆写addChild()需要使用override关键字,同父类(或超类)的addChild()函数一样, 添加child对象,把对象放到children数组中. 此外,类的getter/setter 方法(属性)也可以重载,但AS3中有一些对象不能覆写: Variables Constants

Static methods

Methods that are not inherited

Methods that implement an interface method

Inherited methods that are marked as final in the superclass

变量 | 常量 | 静态函数 | 非继承函数 | 接口函数 | 父类(或超类)中被标识为final的函

18

另外,override对于覆写Object类的子类成员没有必要的,包括:

hasOwnProperty isPrototypeOf

propertyIsEnumerable setPropertyIsEnumerable toString valueOf

这些方法是动态添加的,并不是类的初始成员,而override只用于类初始成员.但是,如果这些函数是一个类初始定义成员,那么在这个类的子类中重载这些函数时,还是需要用override标识符的,举个例子,在扩展Object类的时候,重载toString()不需要override,而扩展sprite时,重载toString()要用到override关键字,这是因为toString()是sprite类初始成员.

21.prototype的用法

as中 prototype 对象的值由类的所有实例共享, as1/2时用它来控制类的继承,如果给子类实体(a subclass instance)赋一个变量值,这个变量值首先被这个实例得到,然后被这个子类的prototype 对象得到,然后是父类(超类)的prototype 对象,依次向上,因此,prototype 对象贯穿类的整个继承.

ActionScript 1.0 中创建继承

类的所有实例都具有 __proto__ 属性,该属性指出这些实例继承自哪个对象。在使用构造函数创建对象时,

会将 __proto__ 属性设置为引用其构造函数的 prototype 属性。 继承会按照明确的层级向下延伸。在调用对象的属性或方法时,ActionScript 会查看该对象,确定是否存在这样一个元素。如果不存在,ActionScript 会查看该对象的 __proto__ 属性以获得信息(myObject.__proto__)。如果该属性不是该对象的 __proto__ 对象的属性,ActionScript 就会查看myObject.__proto__.__proto__,依此类推。

AS3主要用类继承(Class inheritance)语法格式来管理类的继承,但prototype对象仍然存在,而且和as1/2中的用法类似as3中的函数和类都有一个prototype 对象 ,对于类,prototype 对象是只读的,不能重新定义它为新的值,当然,可以重新定义prototype 对象包含的值.附:也就是说我们不能直接这样做MyClass.prototype=100;我们可以:MyClass.prototype.num=100;对于函数,prototype 对象不是只读的,仍然可以像as1中类定义那样,通过函数来动态的创建类,也可以重新定义prototype 对象来继承类(函数).

package {

import flash.display.Sprite;

public dynamic class MyClass extends Sprite { public function MyClass(){

// prototype = new Object(); // ERROR, cannot change prototype of class prototype.newValue = 1; // OK, adding (or removing) prototyped values

19

trace(this.newValue); // 1

trace(prototype.toString); // function Function() {} trace(prototype.addChild); // undefined trace(addChild); // function Function() {} // dynamic (\var TempClass:Function = function():void { trace(\}

TempClass.prototype = prototype; // OK, can set up inheritance var tempObject:* = new TempClass(); // \trace(tempObject.newValue); // 1 } } }

注意:this.newValue 用this 关键字做动态变量的前缀

类方法是动态的,在prototype中定义的,( 也就是构造函数),所以不用override关键字重写 tempObject类型是*,而不是TempClass类型,因为TempClass在AS3中只是作为一个函数,尽管它仍能起到类的作用,但不是真正的类了,用它们创建的实体也只作为一般对象使用.

22.正则表达式

AS3支持正则表达式了,用法和js中的着不多.匹配模块有两种定义方法: 1.用RegExp类的构造函数(顶级)定义. 2.用字符串或者文本格式定义.

var reCon:RegExp = new RegExp(\var reLit:RegExp = /\\w+/i;

RegExp类方法包括:

RegExp.exec() RegExp.test()

String类中用于正则表达式的方法包括:

String.match() String.replace() String.search()

flex livedocs 上的RegExp类帮助 一个例子:

package {

import flash.display.Sprite;

20


龙图教育:AS3方法和技巧(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:深圳黑弧广告-员工手册

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: