AS3 - 抽象类

31

我该如何在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...
    }
}

但是...我不喜欢这种方式,而且没有编译时错误。

4个回答

24

抽象类在ActionScript 3中不被支持。请参见http://joshblog.net/2007/08/19/enforcing-abstract-classes-at-runtime-in-actionscript-3/,此链接还提供了一种创建抽象类的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/


这很有帮助,但它只有运行时错误...有没有一种方法可以在编译时进行检查? - Lucas Gabriel Sánchez

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");
        }
   }
}

6
在 AS3 中,只需使用接口来确保在编译时实现所有函数。虽然不同,但对于上面的示例可以起到作用。

0
只要ActionScript不允许非公共构造函数,你就必须依赖于运行时错误来实现抽象类和单例模式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接