如何很好地在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...
}
}
但是......我不喜欢这样。并且没有编译时错误。
答案 0 :(得分:23)
抽象类。请参阅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-for-actionscript-30-the-dependency-inversion-principle/
答案 1 :(得分:12)
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");
}
}
}
答案 2 :(得分:6)
在AS3中只使用接口来确保所有函数都在编译时实现。 我知道它有所不同,但是就像上面的那个例子那样。
答案 3 :(得分:0)
只要他们不允许动作脚本中的非公共构造函数,你就不得不依赖抽象类和单例的运行时错误。