2009-07-22 4 views
1

ActionScriptでは、すべてのコンストラクターはパブリックである必要があります。ただし、クラスの新しいインスタンスを作成できるようにすることはできません(物理的なシステムリソース、ネットワークソケットなどに結びついている可能性があるため)。ActionScriptで内部ctorをシミュレートしますか?

ActionScriptでクラスを作成不可能にする方法があるかどうかはanyonyが知っていますか?本質的には、どのような私が目指してることは次のとおりです。

public class SomeClass 
{ 
    internal function SomeClass():void { } 
    . . . 
} 

私はインターフェイスを定義し、内部クラスでそれを実装することでこれを回避できたと仮定し、それはちょうど私に右に感じることはありません。

internal class ClassImpl implements ISomeClass 
{ 
    . . . 
} 

提案?

答えて

1

ええ、安全引数トリック...

それは良いスタートですが、あなたは数字に渡す(プラス1のチャンスがある場合は、単純な数で、それだけで、ランタイムエラーがスローされます:)/2^64あなたは正しい数を推測する:... D)...コンパイル時のエラーも同様にしたい場合は、これを使用してください(1つの愚かなことは、タイプを非-nullable、常になりますので、nullを有効な引数):

package { 
    public class Test { 
     public function Test(enforcer:TestEnforcer) { 
      if (enforcer == null) throw "haha, good try ... but, no! :P"; 
     } 
     public static function create():Test { 
      //do your cheks here 
      return new Test(TestEnforcer.enf); 
     } 
    } 
} 
class TestEnforcer { 
    public function TestEnforcer() { } 
    public static const enf:TestEnforcer = new TestEnforcer(); 
} 

別のアプローチは、パブリックインターフェイスMyPrivateConstrClassと内部/プライベートクラスMyPrivateConstrClassImplを作成し、別の楽しみを持っていることですそれはMyPrivateConstrClassImplをインスタンス化しますが、その関数の戻り値の型MyPrivateConstrClassであることもらおうction ...それはちょっとやり過ぎだが、100%のコンパイル、安全なランタイム...

greetz

back2dos

+1

Object型のプライベート静的フィールドを持ち、オブジェクトに対して厳密に等しい(===)チェックを実行するだけで、この実装を簡略化できます。 –

+0

はい、いいえ...このアプローチのポイントは、TestEnforcerがプライベートクラスであるため、ctorに有効な値を渡すことができないということです。もちろん常にnullです... – back2dos

1

ここには、コンストラクタが動作するためのa magic number is neededの解決策があります。うまくいけば、これは助けになるかもしれない。

+0

リンクがダウンしているようです。私はそれ自身を考えましたが、「マジック」パラメータでctorを混乱させたくありませんでした。ありがとう – cmroanirgo

関連する問題