publicとinternalはクラスに修飾できるので、それ以外のprivate(自分のみアクセス可能なコンストラクタ)とprotected(継承したクラスのみアクセス可能なコンストラクタ)を作ってみる。注意する点があって、ここで言うprotectは継承クラスのアクセスは可能で自分のアクセスは不可。というのも親玉クラスをAbstractクラスとして扱いたいという理由があったからです(サブクラスのみnew可能にしたかった)。
privateクラス
privateにしたいクラス(TestPrivate)ファイル内のパッケージ外部にダミークラスを作成し、TestPrivateクラスのコンストラクタの引数にする。DummyクラスはTestPrivateクラスファイル内ではアクセス可能だが、その他からはアクセス不可能でnewしようとするとコンパイルエラーになる。実際にインスタンスを使用する場合はTestPrivateクラス内のメソッド経由(ここではgetInstance)で作成するしかない。少し改良を加えるとsingletonインスタンスを作るときに使える。
//TestPrivate.as package com.borealkiss{ public class TestPrivate { private _instance:TestPrivate; //Constructor public function TestPrivate(dummy:PrivateClass){ } public static function getInstance():TestPrivate{ _instance = new TestPrivate(new Dummy()); return _instance; } } } //Dummy class outside the package but still in the same file. class Dummy{ //Constructor public function Dummy(){ } }
protectedクラス
protectedにしたいクラス内にそのクラス名を記述したコンスタントを作成しておく。コンストラクタ内でnewされようとしているクラス名と比較し、合致したらエラーを吐かせる。TestProtectedクラスをnewするとエラーが表示されるが、TestProtectedクラスのサブクラスの場合、getQualifiedClassname(this)の内容が変化するのでnew可能。Abstractクラス(サブクラスのみnew可能)として利用できる。
//TestProtected.as package com.borealkiss{ import flash.errors.IllegalOperationError; import flash.utils.getQualifiedClassName; public class TestProtected { private static const THIS_CLASS_NAME:String = "com.borealkiss:TestProtected"; //Constructor public function TestProtected(){ if (getQualifiedClassName(this) == THIS_CLASS_NAME){ throw new IllegalOperationError("Must be subclassed to use."); } } } }