31 Stimmen

AS3 - Abstrakte Klassen

Wie kann ich eine abstrakte Klasse in AS3 schön machen?

Ich habe das ausprobiert:

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...
    }
}

Aber ich mag diesen Weg nicht. Und hat keine Kompilierzeitfehler.

24voto

Jonathan Fingland Punkte 54655

Abstrakte klassen werden von actionscript 3 nicht unterstützt. siehe http://joshblog.net/2007/08/19/enforcing-abstract-classes-at-runtime-in-actionscript-3/

die obige Referenz bietet auch eine Art von hackish Workaround, um abstrakte Klassen in as3 zu erstellen.

bearbeiten
siehe auch http://www.kirupa.com/forum/showpost.php?s=a765fcf791afe46c5cf4c26509925cf7&p=1892533&postcount=70

Bearbeiten 2 (Als Antwort auf einen Kommentar)

Leider müssen Sie mit dem Laufzeitfehler leben. Eine Alternative würde ein geschützter Konstruktor.... sein, aber auch das ist in as3 nicht möglich. Siehe http://www.berniecode.com/blog/2007/11/28/proper-private-constructors-for-actionscript-30/ y http://gorillajawn.com/wordpress/2007/05/21/actionscript-3-%E2%80%93-no-private-constructor/ .

Vielleicht finden Sie auch diese nützlich: http://www.as3dp.com/category/abstract-classes/ und vor allem, http://www.as3dp.com/2009/04/07/design-pattern-principles-for-actionscript-30-the-dependency-inversion-principle/

12voto

bitmapdata.com Punkte 9545
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");
        }
   }
}

6voto

Theo.T Punkte 8315

In AS3 würde nur Schnittstellen verwenden, um sicherzustellen, dass alle Funktionen zur Kompilierzeit implementiert werden. Ich weiß, es anders, aber tut den Trick für ein Beispiel wie das oben genannte.

0voto

Amarghosh Punkte 56804

Solange sie keine nicht-öffentlichen Konstruktoren in Actionscript zulassen, müssen Sie sich auf Laufzeitfehler für abstrakte Klassen und Singletons verlassen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X