[转]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。
转载:http://harryxu.cn/blog/as3%E4%B8%AD%E5%AE%9E%E7%8E%B0%E8%BF%90%E8%A1%8C%E6%97%B6%E5%BC%BA%E5%88%B6%E7%9A%84%E6%8A%BD%E8%B1%A1%E7%B1%BB
本文出自: dmh2002's Blog, 原文地址: http://dmh2002.com/post/87.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值