この記事のURL

http://www.dango-itimi.com/blog/archives/2005/000732.html


FLASH tips パッケージ名とインスタンス名のバッティング

パッケージ名と同じインスタンス名を利用し、かつそのインスタンスから同パッケージに属する他のクラスを呼び出そうとすると、その時点で処理がぷっつり止まってしまう、という現象が起きます。この現象は忘れた頃にたまに引っかかり頭を悩まされます。

詳細は次の通り。

sampleパッケージに属するCheckクラスとReadクラスがあるとします。

//Check.as
import sample.Read;
class sample.Check{

	public function Check(){ trace( "checkA" ); }

	public function test():Void{

		trace( "checkB" );
		var read:Read = new Read();
	}
}

//Read.as
class sample.Read{

	public function Read(){ trace( "checkC" ); }
}


CheckクラスからはReadクラスのコンストラクタを呼び出しています。

次にタイムラインからCheckクラスのオブジェクトをインスタンス名sampleで作成し処理を呼び出します。

import sample.Check;

var sample:Check = new Check();
sample.test();

trace( "checkD" );


これを実行しますと一見、checkA checkB checkC checkD と出力されそうですが、実際は

checkA
checkB

と出力して止まります。

Check.testメソッドからReadクラスのオブジェクトを作成している行をコメントアウトすると

checkA
checkB
checkD

と、期待通りの動作を行います。
また、インスタンス名をsampleではなくsampleObj等にすれば、checkA~checkDまで順番に出力されます。

原因は色々あるのでしょうけれども ひとまず、パッケージ名と同じインスタンス名を使用するのは危険なので禁止ということで。この途中で止まると言う中途半端さが問題点を見つけにくくしていて まどろっこしかです。

[ FLASH ] [ tips ] 投稿者 siratama : 2005年05月21日 01:22

トラックバック

http://www.dango-itimi.com/blog/mt-tb.cgi/694

コメント

以下コメントを書き込むだけでは、管理人には通知が行われません。通知を行いたい場合、管理人の書き込みに「返信」を押してコメントをしていただくか、あるいは Google+, Twitter へご連絡ください。




[EDIT]