论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > Flash AS编程教程
Tag:2.0,3.0菜鸟,游戏,,cs,技巧,源码,,文本,文字,函数,音乐,随机,拖拽,asp,access,xml,mc,视频教程

AS3中实现运行时强制的抽象类

文章类别:Flash AS编程 | 发表日期:2008-10-6 17:43:43


看到这篇文章不错,可以学到一些技巧,记录一下 :)
原文: Runtime Enforcement of Abstract Classes in AS3

要实现抽象类需要满足两点要求:
1.抽象类不能被实例化
2.子类中必须实现抽象类中的抽象方法

AS3没有提供类似Java中抽象类的特新,不过这篇文章的作者通过一些编程技巧实现了这两个特性

强制抽象类不能实例化
由于在一个调用一个类的构造函数之前,无法访问当前类的实例,所以在需要实现的抽象类的构造函数中定义一个参数,如果这个参数引用的对象不是当前的实例那就抛出异常。

PLAIN TEXT
Actionscript:
  1. package
  2. {
  3. import flash.errors.IllegalOperationError;
  4. public class MyAbstractType
  5. {
  6.     public function MyAbstractType(self:MyAbstractType)
  7.     {
  8.         if(self != this)
  9.         {
  10.             //这样就只有该类的子类中能传入当前实例的引用
  11.             throw new IllegalOperationError("Abstract class did not receive reference to self. MyAbstractType cannot be instantiated directly.");
  12.         }
  13.     }
  14. }
  15. }

这时候如果 在外部 new MyAbstractType(); ,传入任何参数运行时都会抛出异常,只有在该类和该类的子类内部可以传入当前对象的引用,即 this

PLAIN TEXT
Actionscript:
  1. package com.joshtynjala.abstract
  2. {
  3. public class MyConcreteType extends MyAbstractType
  4. {
  5.     public function MyConcreteType()
  6.     {
  7.         //传入 "this" 来通过抽象类的检查
  8.         super(this);
  9.     }
  10. }
  11. }

 

强制子类实现抽象父类的抽象方法
这个特性主要通过flash.utils.describeType()遍历出对象的所有方法,判断指定的抽象方法是否在子类中全部实现了。

PLAIN TEXT
Actionscript:
  1. package com.joshtynjala.abstract
  2. {
  3. import flash.errors.IllegalOperationError;
  4. import flash.utils.describeType;
  5. import flash.utils.getQualifiedClassName;
  6. public class MyAbstractType
  7. {
  8.     public function MyAbstractType(self:MyAbstractType)
  9.     {
  10.         if(self != this)
  11.         {
  12.             //这样就只有该类的子类中能传入当前实例的引用
  13.             throw new IllegalOperationError("Abstract class did not receive reference to self. MyAbstractType cannot be instantiated directly.");
  14.         }
  15.         //数组中记录所有必须在子类中实现的方法
  16.         var unimplemented:Array = [mustBeOverridden];
  17.         //获取抽象类的全名
  18.         var abstractTypeName:String = getQualifiedClassName(MyAbstractType);
  19.         //得到抽象类中定义的所有方法
  20.         //如果在子类中覆盖了一个方法,XML的method节点的declaredBy属性将会是子类的名字
  21.         var selfDescription:XML = describeType(this);
  22.         var methods:XMLList = selfDescription.method.(@declaredBy == abstractTypeName && unimplemented.indexOf(this[@name])>= 0);
  23.         if(methods.length()> 0)
  24.         {
  25.             //在这里抛出一个异常,提示未实现的抽象方法
  26.             var concreteTypeName:String = getQualifiedClassName(this);
  27.             throw new IllegalOperationError("Function " + methods[0].@name + " from abstract class " + abstractTypeName + " has not been implemented by subclass " + concreteTypeName);
  28.         }
  29.     }
  30.     //implemented
  31.     public function alreadyImplemented():void
  32.     {
  33.         trace("Don't forget to list me in the Array of valid functions.");
  34.     }
  35.     //unimplemented
  36.     public function mustBeOverridden(param:String):void {};
  37. }
  38. }

 

现在,在继承抽象类的MyConcreteType类中就必须覆盖 mustBeOverridden() 方法,如果不覆盖的话,就会在运行时抛出异常了。

PLAIN TEXT
Actionscript:
  1. package com.joshtynjala.abstract
  2. {
  3. public class MyConcreteType extends MyAbstractType
  4. {
  5.     public function MyConcreteType()
  6.     {
  7.         //pass "this" to clear the abstract check
  8.         super(this);
  9.     }
  10.     //implemented
  11.     override public function mustBeOverridden(param:String):void
  12.     {
  13.         trace("param:", param);
  14.     }
  15. }
  16. }

 

这里只是简单的记录一下,不能算是翻译,若有错误欢迎指正 :)
详情见原文: Runtime Enforcement of Abstract Classes in AS3


对于这个东西,我个人感觉,既然AS3没有提供真正的抽象类特性,如果不是要求特别严格,只要依照抽象类的概念规范代码即可,似乎也不是必须按照这个方法来实现,俺猜测,如果类结构比较复杂的话 describeType() 可能会影响速度。
记录这篇的主要目的是学习作者的编程技巧与思考方式,hoho。
视频教程列表
文章教程搜索
 
Flash AS推荐教程
Flash AS热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058