AS3 - Абстрактные классы - PullRequest
31 голосов
/ 08 октября 2009

Как я могу красиво создать абстрактный класс в 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 ]

23 голосов
/ 08 октября 2009

абстрактные классы не поддерживаются ActionScript 3. см. http://joshblog.net/2007/08/19/enforcing-abstract-classes-at-runtime-in-actionscript-3/

Приведенная выше ссылка также предоставляет своего рода хакерский обходной путь для создания абстрактных классов в as3.

Редактировать
также см. 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/

12 голосов
/ 12 марта 2013
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 голосов
/ 09 октября 2009

В AS3 просто используются интерфейсы, чтобы убедиться, что все функции реализованы во время компиляции. Я знаю это по-другому, но делает пример для примера, такого как приведенный выше.

0 голосов
/ 08 октября 2009

Пока они не разрешают закрытые конструкторы в ActionScript, вам придется полагаться на ошибки времени выполнения для абстрактных классов и синглетонов.

...