代码改变世界

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);
}
}
}
 
强制子类实现抽象父类的抽象方法 这个特性主要通过flash.utils.describeType()遍历出对象的所有方法,判断指定的抽象方法是否在子类中全部实现了。
 
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 {};
}
}
 
现在,在继承抽象类的MyConcreteType类中就必须覆盖 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。

 

12 Comments.

  1. gravatar
    Posted 2007-08-22 10:44:42|Permalink|回复

    一个很有特点的抽象类实现,不过我个人觉得比起这个抽象类给我们带来的价值不是很值得使用,因为这样可能会带来效率的问题,因为每建立一个对象都要进行这些检查增加了不必要的负担,而且这些检查混乱了本有的逻辑。我自己也写了一个, http://jeffxu.wordpress.com/2007/08/22/as3对abstract-class的实现/ 有兴趣可以看看

  2. gravatar
    Posted 2007-08-22 19:16:07|Permalink|回复

    恩,我想作者那样做的目的是为了尽可能早的抛出异常,在对象建立的时候就进行检测,不过效率上可能是会有损失。

  3. gravatar
    Posted 2007-08-29 09:19:58|Permalink|回复

    上次也看到老外的那篇文章,想了想还是觉得没必要去这么做--#

  4. gravatar
    Posted 2007-08-29 19:46:40|Permalink|回复

    嘿嘿,俺也是这么觉得,所以在最后说明了只是为了学习一下技巧 ^^

  5. gravatar
    Posted 2007-08-31 21:22:49|Permalink|回复

    能做个连接吗,你的已经加上了。

    疯狂的设计 http://www.hazj.cn/

  6. gravatar
    Posted 2007-09-21 02:58:04|Permalink|回复

    我觉得看使用的场合而定毕竟as3提倡的是OOP 学过C ,java的人都知道知道OOP的好处之所以这么做的目的是为了弥补adobe的flash带来的缺陷如果从编程规范上来说的话,遵循它得到的好处大于不好的一面

    ............. 这个验证码让我晕,我都提交仂3次仂。。。。

  7. gravatar
    Posted 2007-09-21 23:50:23|Permalink|回复

    :shock: 验证码字体可能是扭曲了一些,不过我都设的是英文单词,不是随机字母,应该不是很难看清吧?

  8. gravatar
    Posted 2007-09-24 15:28:32|Permalink|回复

    :smile: 从Google搜索东西链接进来,挺喜欢这个博客,博主兴趣和我差不多,不知能否交换个链接

  9. gravatar
    Posted 2007-09-24 16:17:20|Permalink|回复

    :mrgreen: ok,其实俺一直订阅着达达高手的blog呢,学到不少东西,嘿嘿链接已加上

  10. gravatar
    Posted 2007-09-25 09:03:27|Permalink|回复

    :shock: 噢?这么巧啊...还不知道有人会订阅我的Blog,呵呵

  11. gravatar
    Posted 2008-11-04 14:09:28|Permalink|回复

    我觉得在架构和效率上应该有一个均衡点,没有哪个是必要的哪个是不必要的,只有需要与不需要

  12. gravatar
    Posted 2008-11-04 16:44:09|Permalink|回复

    呵呵,刚才修改了一下这篇1年多钱文章的代码格式,肯定又在rss里输出了没错啊,主要还是看需求来定

Post a Comment