クラスに名前をつけることは、クラス内で定義されているプロパティをクラスの名前空間に結びつける行為と考えることができます。パッケージやインターフェースについても同様です。これらの名前空間はプログラムの構造と固く結びついていますが、namespace を使うとプログラムの構造から独立して名前空間を扱えるようになります。例えば、任意の単位でクラスの振舞いを変えたり、実行時に動的に名前空間をプロパティと結びつけて可視/不可視をコントロールすることができます。
namespace の宣言
namespace はパッケージ内とクラス内で定義することができます。定義方法は基本的に変数の定義と同様です。
SampleClass.as: package sample { public class SampleClass { // クラス内に名前空間を定義 public static namespace myNSinClass; } } myNSinPackage.as: package sample { // パッケージ内に名前空間を定義 public namespace myNSinPackage; }
パッケージレベルで public な名前空間を宣言するときは単独のファイルに記述します。public なリソースの宣言は一ファイルに付き一つのルールが適用されるためです。(EcmaScript プロポーザルによれば、クラス内の名前空間の宣言は static にする必要があるはずですが、現バージョンではインスタンス変数としても宣言できてしまいます。これは将来のバージョンでは修正されるものと思います)
名前空間には別名を作成したり明示的に値を与えることもできます。
// 匿名の名前空間を定義 public namespace myNS1; // myNS1 の別名を定義 public namespace myNS2 = myNS1; // 明示的に値を指定して名前空間を定義 public namespace myNS3 = "http://www.sample.com/namespace";
修飾名の使用
属性を定義する際に属性が所属する名前空間を指定するには、以下のように記述します。
public static namespace myNS1; public static namespace myNS2; myNS1 var foo:int = 0; myNS2 var foo:String = "zero";
この例では foo という名前の属性が2つ定義されていますが、それぞれ別の名前空間に属しているため異なる属性として区別されます。参照する際は以下の形式で修飾名を記述します。
trace(myNS1::foo); // 0 が出力される trace(myNS2::foo); // zero が出力される
また、属性定義時に複数の名前空間を指定することもできます。この場合、属性の実体はあくまで一つです。属性の別名を定義したと考えると良いでしょう。
myNS1, myNS2 var foo:int = 0; trace(myNS1::foo); // 0 が出力される trace(myNS2::foo); // 0 が出力される
属性の宣言時、namespace を使って定義された名前空間の指定はクラスのトップレベルの属性のみに適用可能です。メソッド内のローカル変数定義等には使用できません。
public class SampleClass { public static namespace myNS1; myNS1 var foo:int = 0; // OK public function myFunction():Void { myNS1 var bar:int = 0; // NG } }
コメントする