AS3中实现运行时强制的抽象类
2008-11-27 19:10 宝宝合凤凰 阅读(361) 评论(0) 收藏 举报AS3中实现运行时强制的抽象类
看到这篇文章不错,可以学到一些技巧,记录一下 :) 原文: Runtime Enforcement of Abstract Classes in AS3
要实现抽象类需要满足两点要求: 1.抽象类不能被实例化 2.子类中必须实现抽象类中的抽象方法
AS3没有提供类似Java中抽象类的特新,不过这篇文章的作者通过一些编程技巧实现了这两个特性 强制抽象类不能实例化 由于在一个调用一个类的构造函数之前,无法访问当前类的实例,所以在需要实现的抽象类的构造函数中定义一个参数,如果这个参数引用的对象不是当前的实例那就抛出异常。
package { import flash.errors.IllegalOperationError; public class MyAbstractType { public function MyAbstractType(self:MyAbstractType) { if(self != this) { //这样就只有该类的子类中能传入当前实例的引用 throw new IllegalOperationError("Abstract class did not receive reference to self. MyAbstractType cannot be instantiated directly."); } } } }
new MyAbstractType(); ,传入任何参数运行时都会抛出异常,只有在该类和该类的子类内部可以传入当前对象的引用,即 this。
package com.joshtynjala.abstract { public class MyConcreteType extends MyAbstractType { public function MyConcreteType() { //传入 "this" 来通过抽象类的检查 super(this); } } }
package com.joshtynjala.abstract { import flash.errors.IllegalOperationError; import flash.utils.describeType; import flash.utils.getQualifiedClassName; public class MyAbstractType { public function MyAbstractType(self:MyAbstractType) { if(self != this) { //这样就只有该类的子类中能传入当前实例的引用 throw new IllegalOperationError("Abstract class did not receive reference to self. MyAbstractType cannot be instantiated directly."); } //数组中记录所有必须在子类中实现的方法 var unimplemented:Array = [mustBeOverridden]; //获取抽象类的全名 var abstractTypeName:String = getQualifiedClassName(MyAbstractType); //得到抽象类中定义的所有方法 //如果在子类中覆盖了一个方法,XML的method节点的declaredBy属性将会是子类的名字 var selfDescription:XML = describeType(this); var methods:XMLList = selfDescription.method.(@declaredBy == abstractTypeName && unimplemented.indexOf(this[@name])>= 0); if(methods.length()> 0) { //在这里抛出一个异常,提示未实现的抽象方法 var concreteTypeName:String = getQualifiedClassName(this); throw new IllegalOperationError("Function " + methods[0].@name + " from abstract class " + abstractTypeName + " has not been implemented by subclass " + concreteTypeName); } } //implemented public function alreadyImplemented():void { trace("Don't forget to list me in the Array of valid functions."); } //unimplemented public function mustBeOverridden(param:String):void {}; } }
mustBeOverridden() 方法,如果不覆盖的话,就会在运行时抛出异常了。
package com.joshtynjala.abstract { public class MyConcreteType extends MyAbstractType { public function MyConcreteType() { //pass "this" to clear the abstract check super(this); } //implemented override public function mustBeOverridden(param:String):void { trace("param:", param); } } }
这里只是简单的记录一下,不能算是翻译,若有错误欢迎指正 :) 详情见原文: Runtime Enforcement of Abstract Classes in AS3
对于这个东西,我个人感觉,既然AS3没有提供真正的抽象类特性,如果不是要求特别严格,只要依照抽象类的概念规范代码即可,似乎也不是必须按照这个方法来实现,俺猜测,如果类结构比较复杂的话
describeType() 可能会影响速度。记录这篇的主要目的是学习作者的编程技巧与思考方式,hoho。
浙公网安备 33010602011771号
12 Comments.
一个很有特点的抽象类实现,不过我个人觉得比起这个抽象类给我们带来的价值不是很值得使用,因为这样可能会带来效率的问题,因为每建立一个对象都要进行这些检查增加了不必要的负担,而且这些检查混乱了本有的逻辑。我自己也写了一个, http://jeffxu.wordpress.com/2007/08/22/as3对abstract-classçå®ç°/ 有兴趣可以看看
恩,我想作者那样做的目的是为了尽可能早的抛出异常,在对象建立的时候就进行检测,不过效率上可能是会有损失。
上次也看到老外的那篇文章,想了想还是觉得没必要去这么做--#
嘿嘿,俺也是这么觉得,所以在最后说明了只是为了学习一下技巧 ^^
能做个连接吗,你的已经加上了。
疯狂的设计 http://www.hazj.cn/
我觉得看使用的场合而定毕竟as3提倡的是OOP 学过C ,java的人都知道知道OOP的好处之所以这么做的目的是为了弥补adobe的flash带来的缺陷如果从编程规范上来说的话,遵循它得到的好处大于不好的一面
............. 这个验证码让我晕,我都提交仂3次仂。。。。
:shock: 验证码字体可能是扭曲了一些,不过我都设的是英文单词,不是随机字母,应该不是很难看清吧?
:smile: 从Google搜索东西链接进来,挺喜欢这个博客,博主兴趣和我差不多,不知能否交换个链接
:mrgreen: ok,其实俺一直订阅着达达高手的blog呢,学到不少东西,嘿嘿链接已加上
:shock: 噢?这么巧啊...还不知道有人会订阅我的Blog,呵呵
我觉得在架构和效率上应该有一个均衡点,没有哪个是必要的哪个是不必要的,只有需要与不需要
呵呵,刚才修改了一下这篇1年多钱文章的代码格式,肯定又在rss里输出了没错啊,主要还是看需求来定