名前空間
Posted by ton in AS3, Flash on 07 15th, 2008| icon3No Comments »

AS3の定義済みの名前空間にはpublic、private、protected、internal があります
何も書かない場合デフォルトはinternalになります

今回はそんな名前空間の説明ではなくてw
カスタム名前空間を使うお話

AS3では定義済みの名前空間のほかにも自分で名前空間を作ることが出来ます
名前空間の定義の仕方は
変数宣言varのように名前空間宣言namespaceを使います

namespace name [= uri]

名前空間に明示的にURIを定義して名前空間定義を一意にすることができます。
例えば
[source='as'3]namespace ton = "http://ton-up.net/";[/source]
こんな感じ
URI を省略することもできます。その場合、コンパイラは URI の代わりに一意の内部 ID ストリングを作成します。この内部 ID ストリングにはアクセスできません。

namespace ton;

普段はこのようにURIを省略したほうがラク

次はこの定義した名前空間に定義を配置する方法
関数、変数、定数にカスタム名前空間を適用することができます
publicなどの名前空間と同じです


ton function hoge():void{ }
ton var hoge_:int = 0;
ton const HOGE:int = 100;

名前空間を適用する際の注意

・適用できる名前空間は宣言ごとに 1 つだけです。

・名前空間属性を一度に複数の定義に適用することはできません。

 つまり、10 個の異なる関数に名前空間を適用する場合、

 10 個の異なる関数それぞれに名前空間を属性として追加する必要があります。

・名前空間とアクセス制御指定子は相互に排他的であるため、

 名前空間を適用すると、アクセス制御指定子を指定することはできません。

 つまり、名前空間を適用すると、public、private、protected、または internal として

 関数またはプロパティを宣言することはできません。

んで、これらを参照する方法
publicやprivateなどの名前空間の場合は明示的に参照する必要はありませんでしたが、
カスタム名前空間は明示的に参照する必要があります
use namespace ディレクティブで名前空間を参照するか、名前修飾子 (::) を使用して名前空間で名前を修飾できます


use namespace ton;
hoge();
trace(hoge_);

use namespace で名前空間を開くとそのコードブロック内で名前空間の名前にアクセスすることができます
名前空間は何個も開くことができますが明示的に閉じることはできません。
あまり開きすぎると名前の衝突が起きやすくなるので注意

名前修飾子(::)を使用した場合は名前が衝突することはありません

ton::hoge();
trace(ton::hoge_);

また名前空間の変数を作ってアクセスすることもできます

var ns:Namespace = ton;
ns::hoge();
trace(ns::hoge_);

これらを利用した例をおいときます

Flash Player 10 にしてください


package {
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.text.TextField;

	[SWF(width=100,height=100)]
	public class Test extends Sprite
	{
		public function Test()
		{
			textField.text = "Clickしてください";
			addChild(textField);
			stage.addEventListener(MouseEvent.CLICK, onClick);
		}
		private var textField:TextField = new TextField();
		private namespace test1;
		private namespace test2;
		private var ns:Namespace = test1;

		test1 function test():void{
			textField.text = "test1";
		}
		test2 function test():void{
			textField.text = "test2";
		}
		private function onClick(event:MouseEvent):void{
			if(ns == test1){
				ns = test2;
			}else{
				ns = test1;
			}
			ns::test();
		}
	}
}
このエントリーを含むはてなブックマークはてなブックマーク - 名前空間 この記事をクリップ!Livedoorクリップ - 名前空間 BuzzurlにブックマークBuzzurlにブックマーク FC2ブックマークへ追加 Bookmark this on Delicious Digg This