2007年 02月 23日

AS3 名前空間

http://d.hatena.ne.jp/nitoyon/20070220/p1
ほー。名前空間の問題っぽいので、クラス中のアクセス方法を変えれば大丈夫なようだ?

package {
	import flash.display.*;
	import flash.text.*;
	import flash.events.Event;
	import flash.utils.*;

	public class HelloWorld extends Sprite {

		public function HelloWorld() {
			var sample:Sample = new Sample();
			log(sample.sample); //=> "fuge"
			// sample.sample = "hoge"; //=> Error: プロパティは読み取り専用です。 (public を通してアクセスしているが、setter が定義されていないため)
			// sample.private::sample = "hoge"; //=> Error: アクセスできないプロパティ sample へのアクセスを、静的型 HelloWorld.as$0:Sample の参照を使用して試行し ました。(private が特別なため)
		}
	}
}

class Sample {
	public function Sample () {
		private::sample = "hoge";
		log(public::sample); //=> "hoge"
		private::sample = "fuge";
		log(public::sample); //=> "fuge"
	}

	private var _sample:String;

	public function get sample():String {
		return _sample;
	}

	private function set sample(v:String):void {
		_sample = v;
	}
}

内部からは接頭辞つけて明示してあげるといける。これでいいのかはわからないけど


あとついでに、

package {
	import flash.display.*;
	import flash.text.*;
	import flash.events.Event;
	import flash.utils.*;


	public class HelloWorld extends Sprite {

		namespace unco = "http://lowreal.net/ns/sample";

		public function HelloWorld() {
			var sample:Sample = new Sample();
			log(sample.sample);
			sample.unco::sample = "hoge"; // もちろんエラーはでない
			log(sample.sample); //=> "hoge"
		}
	}
}

class Sample {
	public function Sample () {
		private::sample = "hoge";
		log(public::sample);
		private::sample = "fuge";
		log(public::sample);
	}

	namespace hoge = "http://lowreal.net/ns/sample";

	private var _sample:String;

	public function get sample():String {
		return _sample;
	}

	private function set sample(v:String):void {
		_sample = v;
	}

	hoge function set sample(v:String):void {
		_sample = v;
	}
}

とかキモいことができるみたいだ。