2009-10-08 22 views
29

Come è possibile creare una classe astratta in AS3 in modo corretto?AS3 - Classi astratte

Ho provato questo:

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

Ma .. non mi piace questo modo. E non ha errori di compilazione del tempo.

risposta

22

classi astratte non sono supportati da actionscript 3. vedi http://joshblog.net/2007/08/19/enforcing-abstract-classes-at-runtime-in-actionscript-3/

il riferimento di cui sopra fornisce anche una sorta di soluzione hackish per creare classi astratte in AS3.

Modifica
vedi anche http://www.kirupa.com/forum/showpost.php?s=a765fcf791afe46c5cf4c26509925cf7&p=1892533&postcount=70

Edit 2 (In risposta al commento)

Purtroppo, sei bloccato con l'errore di runtime. Un'alternativa sarebbe avere un costruttore protetto .... tranne as3 non lo consente. Vedi http://www.berniecode.com/blog/2007/11/28/proper-private-constructors-for-actionscript-30/ e http://gorillajawn.com/wordpress/2007/05/21/actionscript-3-%E2%80%93-no-private-constructor/.

È inoltre possibile trovare questi utili: http://www.as3dp.com/category/abstract-classes/ e, in particolare, http://www.as3dp.com/2009/04/07/design-pattern-principles-for-actionscript-30-the-dependency-inversion-principle/

+0

questo è stato molto disponibile, ma ha solo errori di runtime .. c'è un modo di fare questo controllo a tempo di compilazione? –

0

Finché non consentono costruttori non pubblici in ActionScript, che ci si può contare solo su errori runtime per le classi astratte e singleton.

6

In AS3 utilizzare solo le interfacce per assicurarsi che tutte le funzioni siano implementate in fase di compilazione. Lo conosco diverso ma fa il trucco per un esempio come quello sopra.

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