NameSpaceまとめ

ASphalt2でnamespaceをうまく使えないかと思い、namespaceについて調べてみた備忘録。
まずnamspaceの作り方。たとえばnstestというパッケージ内に「ns」というネームスペースを作る場合、
1、ns.asというファイルを作る
2、nstestフォルダに配置。
3、中に以下の記述

package nstest{
	public namespace ns = "http://www.asphalt2.com/nstest";
}

ns=の後の文字列はほかとかぶらなければ任意。
肝はファイル名とネームスペース宣言をあわせる事のようだ。

次に使い方。
まず、functionが呼ばれる側の使い方。
端的に書くと、こんな感じ。

package nstest{

   import nstest.ns;
   use namespace ns;
 
   public class NameSpaceTest{
    
     public function test(arg:String):void{
        trace("public " + arg);
     }
     ns function test(arg:String):void{
        trace("ns "+arg);
     }
   }
}

import文で、さっき作ったnamespaceをインポートし、「use namespace」で使用するnamespaceを宣言する。
宣言したら、アクセス修飾子の部分にネームスペースが利用できる。
上記の例だと、同じ「test」というFunctionであっても、namespaceが異なるため違うものとして
宣言できる(つまり名前がコンフリクトしても、別物として取り扱える)

次に呼び出し側。

package {
    import nstest.NameSpaceTest;
    import nstest.ns;
    import flash.display.Sprite;
    import flash.utils.describeType;
    
    use namespace ns;

    public class NSTestMain extends Sprite
    {
        public function NSTestMain(){
            main();
        }
        public function main():void {
             var namespacetest:NameSpaceTest = new NameSpaceTest();
             

             namespacetest.public::test("nstest");
             namespacetest.ns::test("nstest");

             trace(describeType(namespacetest));
        }
    }
}

namespaceをimportするのと、use namespace宣言をするのは使われる側と同じ。
namespaceを使って宣言してあるfunctionを呼び出す場合、対象functionのネームスペースを
functionの前につけてやる。
こうすることで、functionの呼び分けが出来る。
またdescribeTypeで情報を取得すると、namespaceの情報が手に入る。上記プログラムの出力はこんな感じ。

public nstest
ns nstest
<type name="nstest::NameSpaceTest" base="Object" isDynamic="false" isFinal="false" isStatic="false">
  <extendsClass type="Object"/>
  <method name="test" declaredBy="nstest::NameSpaceTest" returnType="void" uri="http://www.asphalt2.com/nstest">
    <parameter index="1" type="String" optional="false"/>
  </method>
  <method name="test" declaredBy="nstest::NameSpaceTest" returnType="void">
    <parameter index="1" type="String" optional="false"/>
  </method>
</type>

namespace付きのfunctionは、uriという属性が付く様だ。

ちなみに、

 namespacetest.test("nstest");

の構文はコンパイルエラーになる。(ネームスペースを宣言したfunctionがほかのfunctionとかぶっていた場合、
どのnamespaceのfunctionを呼び出すか明示しないとダメ)
また、

namespacetest["test"]("nstest");

の呼び出しの場合、publicのfunctionが呼び出された。nsの方を呼び出すには

namespacetest.ns::["test"]("nstest");

でうまく行った。

わかったこととしては、
・同じ名前のfunctionでも、namespaceが異なると宣言できるし、呼び出し側も呼び分けができる。
->コンフリクトの防止
・describeTypeを使うと、どういうnamespace宣言か取得できる
 ->特定のnamespace宣言のfunctionだけ抜いたりできる。