2009-10-08 34 views
29

¿Cómo puedo hacer una clase abstracta en AS3 muy bien?AS3 - clases abstractas

He intentado esto:

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

Pero .. No me gusta esta manera. Y no tiene errores de tiempo de compilación.

Respuesta

22

clases abstractas no son compatibles con ActionScript 3. ver http://joshblog.net/2007/08/19/enforcing-abstract-classes-at-runtime-in-actionscript-3/

la referencia anterior también proporciona una especie de solución hacker para crear clases abstractas en AS3.

Editar
ver también http://www.kirupa.com/forum/showpost.php?s=a765fcf791afe46c5cf4c26509925cf7&p=1892533&postcount=70

Editar 2 (En respuesta al comentario)

Por desgracia, le pegan con el error de tiempo de ejecución. Una alternativa sería ser tener un constructor protegido .... excepto AS3 no permite que sea. Ver 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/.

Usted puede también encontrar estos útiles: http://www.as3dp.com/category/abstract-classes/ y, en particular, http://www.as3dp.com/2009/04/07/design-pattern-principles-for-actionscript-30-the-dependency-inversion-principle/

+0

Esto fue muy útil pero tiene solamente los errores de ejecución .. hay una manera de hacer esta comprobación en tiempo de compilación? –

0

Con tal de que no permiten que los constructores no públicas en ActionScript, tendría que depender de los errores de tiempo de ejecución para las clases abstractas y singletons.

6

En AS3 habría sólo tiene que utilizar las interfaces para asegurarse de que todas las funciones se implementan en tiempo de compilación. Lo sé diferente, pero funciona con un ejemplo como el de arriba.

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