2009-10-08 18 views
29

AS3で抽象クラスをうまく作成するにはどうすればよいですか?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... 
    } 
} 

をしかし..私はこの方法が好きではない:

私はこれを試してみました。コンパイル時にエラーが発生しません。

答えて

22

抽象クラスはhttp://joshblog.net/2007/08/19/enforcing-abstract-classes-at-runtime-in-actionscript-3/

上記参照もAS3に抽象クラスを作成するためのハック回避策の種類を提供参照のActionScript 3でサポートされていません。

編集

残念ながら、あなたは実行時エラーで立ち往生している(コメントに反応して)http://www.kirupa.com/forum/showpost.php?s=a765fcf791afe46c5cf4c26509925cf7&p=1892533&postcount=70

編集2を参照してください。 1つの代替に保護されたコンストラクタを持つことになります。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/

+0

コンパイル時にこのチェックを行う方法がある。これは非常に有用だったが、それは唯一のランタイムエラーを持っていますか? –

0

限り、彼らはActionScriptで非パブリックコンストラクタを許可していないとして、あなたは抽象クラスのため、実行時エラーに頼る必要があるだろうシングルトン。

6

AS3は、インターフェイスを使用して、コンパイル時にすべての関数が実装されるようにします。 私はそれを知っていますが、上記のような例のためのトリックはします。

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