open namespaces (とりあえず本記事内では「オープンな名前空間」と訳すことにします)という名前空間のリストがあります。これは、修飾子の付かない属性の参照が行われたとき(例えば ns1::foo ではなく foo)、属性を検索するのに使用されるリストです。リスト内のどの名前空間にも該当する属性名が含まれていなければその属性は参照不可と判断されます。
ある名前空間をオープンな名前空間に宣言するには use namespace を使います。
public static namespace myNS1; public static namespace myNS2; myNS1 var foo:int = 0; myNS2 var foo:String = "zero"; use namespace myNS1 // NS1 をオープンな名前空間に宣言 trace(foo) // 0 が出力される
この例では2つの名前空間に foo という属性が定義されていますが、myNS1 がオープンな名前空間に宣言されてから foo が参照されたため myNS1::foo の方が参照されることになります。
オープンな名前空間に候補となる属性が2つ以上見つかった場合はエラーになります。例えば、上記の例で myNS2 も宣言してから foo を参照すると2つの候補が見つかるため参照の解決が不能な状態になってしまいます。このような場合は myNS2::foo のように修飾名を使用する必要があります。
オープンな名前空間は、クラス定義や関数定義などのブロック単位で有効です。
オープンな名前空間の使用例
オープンな名前空間に明示的に宣言された名前空間は public より優先されます。つまり、同名の属性が2つの名前空間にあっても、片方が public だと public 宣言された属性は無視され曖昧な参照にはなりません。これを利用して、例えばデフォルトの動作が public 関数で実装されている場合のバージョンアップを、元の関数を書き換える代わりに新しく関数を追加する形で行うことができます。
以下は具体的なサンプルです。(ところで、アルファ版ではバグのために以下のコードは動きません。public が同列に扱われてしまうためです。アルファ版で動かすには public の代わりに version1 などの名前空間を使うことになります。)
まず、以下のクラスが最初のバージョンとして作成されていたとします。
SampleClass.as: public class SampleClass { // デフォルトの関数を定義 public function myFunc() {} }
次に、バージョンアップした関数を version2 の名前空間に同じ識別子で定義します。
version2.as: // 新バージョン名を名前空間として定義 public namespace version2 SampleClass.as: public class SampleClass { // デフォルトの関数を定義 public function sampleFunc() {} // 新しい振舞いの関数を追加定義 version2 function sampleFunc() {} }
SampleClass を上記のように変更しても従来から SampleClass を使用していたプログラムには影響しません。一方、version2 の名前空間をオープンな名前空間に宣言すれば新しく追加された関数を使用することができます。
MyClass.as: public class MyClass { // version2 をオープンな名前空間に宣言 use namespace version2 public function myFunc() { var sc:SampleClass = new SampleClass(); // version2::sampleFunc が呼ばれる sc.sampleFunc(); } }
名前空間を使ったバージョン管理の例でした。
コメントする