我怎样才能很好地在AS3中创建一个抽象类?
我试过这个:
public class AnAbstractClass { public function toBeImplemented():void { throw new NotImplementedError(); // I've created this error } } public class AnConcreteClass extends AnAbstractClass { override public function toBeImplemented():void { // implementation... } }
但是......我不喜欢这样.并且没有编译时错误.
actionscript 3不支持抽象类.请参阅http://joshblog.net/2007/08/19/enforcing-abstract-classes-at-runtime-in-actionscript-3/
上面的引用还提供了一种在as3中创建抽象类的hackish变通方法.
编辑
也见http://www.kirupa.com/forum/showpost.php?s=a765fcf791afe46c5cf4c26509925cf7&p=1892533&postcount=70
编辑2(回应评论)
不幸的是,你遇到了运行时错误.一种替代将是有一个受保护的构造....除了AS3不允许,要么.请参阅http://www.berniecode.com/blog/2007/11/28/proper-private-constructors-for-actionscript-30/和http://gorillajawn.com/wordpress/2007/05/21/actionscript- 3-%E2%80%93-no-private-constructor /.
您还可以找到这些有用的内容:http://www.as3dp.com/category/abstract-classes/,特别是http://www.as3dp.com/2009/04/07/design-pattern-principles-换动作-30-的依赖性反转原理/
package { import flash.errors.IllegalOperationError; import flash.utils.getDefinitionByName; import flash.utils.getQualifiedClassName; import flash.utils.getQualifiedSuperclassName; public class AbstractClass { public function AbstractClass() { inspectAbstract(); } private function inspectAbstract():void { var className : String = getQualifiedClassName(this); if (getDefinitionByName(className) == AbstractClass ) { throw new ArgumentError( getQualifiedClassName(this) + "Class can not be instantiated."); } } public function foo():void { throw new IllegalOperationError("Must override Concreate Class"); } } }
package { public class ConcreteClass extends AbstractClass { public function ConcreteClass() { super(); } override public function foo() : void { trace("Implemented"); } } }
在AS3中,只需使用接口来确保所有函数都在编译时实现.我知道它有所不同,但是就像上面的一个例子那样.