代码改变世界

抽象类写法

2008-11-27 17:51  宝宝合凤凰  阅读(1382)  评论(0)    收藏  举报
请注意构造函数中的抽象类写法
package{
  
  import flash.display.Sprite;
  import flash.events.Event;
  
  public class Ball extends Sprite{
    
    public function Ball(){
      //抽象类
      if(this["constructor"] == "[class Ball]"){
        throw new Error("抽象类无法实例化!");
      }
      init();
    }
    
    //初始化
    private function init():void{
      
    }
    
  }
  
}

 

 

 

as3的类机制:
本着一切都是对象的思想as3的类也不可能是个抽象的模板,但是as3的工程师本着模板的思想尽量在概念上向c++和java靠拢。因此在使用as3的类过程中几乎感受不到基于原型的区别。但本质还是基于原型的,只是新的对象复制对象的设计比as2中更加聪明而且没有缺陷。

as3的类结构如下:


as3类结构.gif

 

这是帮助文件中的解释图。可以看出as3的类由四个模块组成。我们来解释一下:

CA--引用其它三大模块的模块。

TA--实例模块,我们在类中定义的实例成员都被放入这个模块中。

TCA--静态成员模块,我们在类中定义的静态成员都被放入这个模块中。

PA--原型对象模块,最初通过 constructor 属性附加到的类对象都被放入这个模块中。


 

对于CA和TCA很好理解,下面对PA进行详细解释:

constructor属性:

constructor属性是老祖宗Object的属性。Object一共只有两个属性,一个是prototype,这个在前面已经讲过。另外一个就是constructor,constructor被定义为对类对象的引用或对以构造函数方式创建的那个构造函数的引用。可以使用一下代码验证:

CODE:


dynamic class A {}
  trace(A.prototype.constructor);      // [class A]
  trace(A.prototype.constructor == A); // true
  var myA:A = new A();
  trace(myA.constructor == A);         // true

 

可以看到对象的constructor属性和类的原型对象的constructor属性都指向class A。

最初通过constructor属性附加到的类对象就是指Ta这个模块记录所有成员的初值。这个初值不会再由于对象的引用而发生改变。引用对象的访问和设置再不会无故修改类的成员。这样类就成为了真正意义上的模板。可以使用以下代码来验证:

CODE:


//MyClass.as
package
{
  public class MyClass
  {
     public var myArray:Array=[1,2,3];
  }
}

//帧
var obj1:MyClass=new MyClass();
obj1.myArray.push(4);
trace(obj1.myArray);

var obj2:MyClass=new MyClass();
trace(obj2.myArray);

 


 

输出:

1,2,3,4

1,2,3


 

原型机制的最大缺陷现在已被解决。那么性能呢?答案是新的模板机制是性能提高10倍的最大因素之一。



 

traits对象:

trait翻译为特性。这个新对象是专门为提高性能而发明的。有了trails对象就不再使用哈希表依靠散列函数去比较获取地址而是使用指针去定位。有了指针后就可以翻译成机器指令去直接找到位置,而不使用哈希表则大大节省了资源。如果对象在as2中需要占用 100 个字节的内存,在 as3中只需要占用 20 个字节的内存。TA和TCA都是traits对象。



 

继承:

继承是把基类的成员直接复制到子类的trait中,从根本上摒弃了搜索原型链接机制。原型链现在只是从理解的意义上来描述搜索过程。



 

两大机制的选择:

即使使用新的类机制as3还是给喜欢使用原型链的程序员留有余地。还有一个因素是为了兼容。可以看出as3的设计是考虑周全的。可以使用命名空间和编译器来选择继承机制,as3而且还保留了两套内置类作为铺垫。


 

使用命名空间选择继承制:

使用AS3作前缀或用use namespace AS3来确定是否使用固定属性继承机制。使用这个命名空间后编译器将尽量选择使用固定属性继承机制。缺省情况下flash和flex已经帮我们打开这个命名空间。我们无需操心。


 

使用编译器选择继承机制:

as还为每组属性提供了编译器选项,以便将 AS3 命名空间应用于整个程序。-as3 编译器选项表示 AS3 命名空间,-es 编译器选项表示原型继承选项(es 代表 ECMAScript)。要打开整个程序的 AS3 命名空间,请将 -as3 编译器选项设置为 true,将 -es 编译器选项设置为 false。要使用原型版本,请将编译器选项设置为相反值。Adobe Flex Builder 3 和 Adobe Flash CS3 Professional 的默认编译器选项是 -as3 = true 和 -es = false。


 

知道继承机制非常重要,因为关系到方法的覆盖。如果我们要继承的类是用as2写的,那么就不能使用override进行方法覆盖。但如果是as3写的则一定要使用override关键字。