3.0では、プライベートなコンストラクタ関数を定義することができません。3.0のコンストラクタ関数について、簡単に説明します。つぎに、プライベートなコンストラクタ定義が必要な例として、デザインパターンのSingletonをどう実装するか考えてみたいと思います。3.0の基礎知識を前提とします。3.0書き方教室」をご参照ください。3.0のクラスは、つぎのようなスタイルで定義します[*1]。クラス本体に定義される、クラスと同名の特別な関数が「コンストラクタ」です。メソッド(関数)定義}}コンストラクタ関数は、インスタンスが作成されるときに呼出されます。したがって、初期設定の処理を記述することが通常です。コンストラクタの引数は、必要があれば指定します。3.0では、定義した引数の型だけでなく、その数が呼出しと一致しない場合にもコンパイルエラーになります。コンストラクタ関数には、戻り値は指定できません。コンストラクタ関数は、最小限その本体ブロック({})内が空でも差支えありません。コンストラクタを定義しなくても、問題なくコンパイルされます。2.0では、「コンパイラによって空のコンストラクタ関数が自動的に作成され」ると説明されています。3.0でも、おそらく同様の内部処理になっているものと推測されます。この点について明記されたドキュメントは見当たりません[*2]。2.0との大きな違いとして、3.0ではコンストラクタ関数にはpublic属性のみ指定可能です。コンストラクタがクラス外から呼ばれないように、private属性を指定することはできないということです。実際上privateなコンストラクタ関数を定義したい場合はありえます。そこで、つぎにデザインパターンのSingletonを例に、その実装方法のひとつをご紹介します。パッケージ名は、指定しないことも可能です。3.0クラス定義」をご参照ください。kamijo「コンストラクタ(とSingleton)」およびそのコメントをご参照ください。Singletonパターンの実装ソフトウェア開発における「デザインパターン」という類型の中に、「Singleton」と呼ばれるパターンがあります[*3]。Singletonパターンでは、クラスからインスタンスはひとつしか作成できません。インスタンスを作成・取得する専用の静的(static)メソッドを用意し、クラスの外からはコンストラクタが呼出せない設計にします。ActionScriptにおけるSingletonパターンのクラスには、SharedObjectがあります。SharedObjectクラスはコンストラクタを使わず、静的(static)メソッドSharedObject.getLocal()によりインスタンスを作成・取得します[*4]。2.0では、コンストタラクタ関数にprivate属性が指定できたので、クラス外から呼出されないようにすることは簡単でした[*5]。3.0では、残念ながらこの指定ができません。そこで以下のサンプル(スクリプト001)では、コンストラクタの呼出しが内部からであることを示すフラグにより、クラス外からの呼出しを回避する手法を採っています。クラス内部からの呼出しであることを示すフラグは、静的(static)プロパティとして設定しました。コンストラクタは、そのプロパティが内部呼出しを示さないときは、エラーを生成(throw)します。インスタンスを取得・生成する静的メソッドは、メソッド内からコンストラクタ関数を呼出す前に、そのプロパティを内部呼出しの値に設定すればよいでしょう。格納されたインスタンスを返す}}}上記スクリプト001のSingletonクラスは、以下のようなフレームアクション(スクリプト002)で簡単にテストすることができます。実行すると、[Output]パネルにはつぎのような出力が表示されます。calledtrue最初のステートメントでは、コンストラクタ関数の呼出しが行われ、コンストラクタは正常にインスタンスを生成して返します。2行目のステートメントは、新規のインスタンスは生成せず、すでに1行目で生成されたインスタンスを返します。したがって、4行目でふたつのインスタンスは同一であることが示されます。コメントアウトされた3行目を有効にすると、コンストラクタを外部から呼出すため、コンパイルエラーを発生します。mySingleton1);privateなコンストラクタの実装は、ほかにも考えられるでしょう。kamijo「コンストラクタ(とSingleton)」では、privateなクラスをコンストラクタの引数に指定することで、外部から呼出しができないようにしています。デザインパターンは、Javaなどの言語で解説されています。Singletonパターンについては、たとえばTECHSCORE「Singletonパターン」が参考になるでしょう。SharedObjectクラスは、コンストラクタ関数が呼出せるようです(ドキュメントにはその記載もないので、サポート外とは思われます)。SharedObject.getLocal()メソッドに渡す引数が異なると、新たなインスタンスを作成するという仕様になっています。Javaも、コンストラクタにprivate修飾子を指定して、Singletonパターンを実装しています(前出注[*3]参照)。