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だけ抜いたりできる。