U⁄A LABO

RSS

SEARCH

AUTHOR

  • KNOCKKNOCK (10件)小遣い2万円のフラッシュデベロッパー。
    帰りが遅いのにキレる嫁をだましだまし制作中・・・。

  • TAKAIW (13件)フラッシュデベロッパー。遊びでゲームを作るのも好きです。外見に似合わないイラストを描くのも好きです。とにかく作るのが好きです。

  • CHIKATHREESIX (8件)メタル界のフラッシュデベロッパー。またある時はメタルギタリスト。オーサリング中もヘッドバンギングは絶やさない。

  • YANBOU (6件)犬と猫で、家が毎日運動会のフラッシュデベロッパー。
    ビールから発泡酒へ変更で節約中。

  • AKUZE (2件)2003年からユナイティアに寄生しているフラッシュデベロッパー。
    シルクドソレイユとカナダが好き。

  • DECO-DEKAI (1件)ビートダウンパートでご飯何杯も食べられます。
    ハードコア・テクニカルディレクターを目指して日々精進。

CATEGORY

HOME  >  クラス名の混同について

2009.08.05 TAKAIW

クラス名の混同について

最近書き込みが少なくなっていますが、
なんとかがんばります。


今回はクラス名の混同について、引っかかったので
メモ。

皆さんご存知のように、表示オブジェクトの中でSpriteクラスというものが
ありますが、こちらはflash.display.Spriteというのが
正式のクラス名です。
import宣言によって、短縮名で記述できるようになっています。

Spriteですが、デフォルトではmouseEnabledとmouseChildrenがtrueで
あるがゆえに、マウス操作に影響しないものの場合、
わざわざmouseEnabledとmouseChildrenをfalseにしないといけません。
そこで私は
jp.co.uniteair.display.Spriteというクラスを
flash.display.Spriteのサブクラスとして作成しました。

package jp.co.uniteair.display{
	public class Sprite extends flash.display.Sprite{
		public function Sprite() {
			this.mouseChildren = false;
			this.mouseEnabled = false;
		}	
	}
}

単なる四角とか点とかのムービークリップはjp.co.uniteair.display.Sprite
を基本クラスに指定することによって、
mouseEnabledとmouseChildrenをfalseにすることを省略できました。

そのまま平穏な日々が続いたのですが、
ちょっとややこしい事態がが発生しました。

下記のような場合、通常だったら

package {
	import flash.display.*;
	public class Hoge {
		public function Hoge() {
			var mc:MovieClip = new MovieClip();
			var sp:Sprite = mc as Sprite;
			trace(sp); 
		}	
	}
}

1フレーム目

var hoge:Hoge = new Hoge();

結果はこうなりますね。

[object MovieClip]

flash.display.MovieClipはflash.display.Spriteの
サブクラスなので、そのまま評価されるからです。


ところが、下記の場合は、

package jp.co.uniteair.display{
	import flash.display.*;
	public class Hoge {
		public function Hoge() {
			var mc:MovieClip = new MovieClip();
			var sp:Sprite = mc as Sprite;
			trace(sp); 
		}	
	}
}

1フレーム目

import jp.co.uniteair.display.Hoge;
var hoge:Hoge = new Hoge();

トレースの結果、下にようになってしまいます。

null

これだと何がおこっているか、よく分からないので、

package jp.co.uniteair.display{
	import flash.display.*;
	public class Hoge {
		public function Hoge() {
			var mc:MovieClip = new MovieClip();
			var sp:Sprite = Sprite(mc);
			trace(sp); 
		}	
	}
}

1フレーム目

import jp.co.uniteair.display.Hoge;
var hoge:Hoge = new Hoge();

TypeError: Error #1034: 強制型変換に失敗しました。flash.display::MovieClip@1e63c941 を jp.co.uniteair.display.Sprite に変換できません。


上記で分かることは
import flash.display.Spriteをしているにもかかわらず、
flash.display.Spriteよりjp.co.uniteair.display.Spriteを優先しているということです。
flash.display.MovieClipはjp.co.uniteair.display.Spriteのサブクラスではありませんので
エラーになります。

これはHogeがjp.co.uniteair.display.Hogeだからです。
(前の例だと正式クラス名もHogeでした。)

クラス名が競合した場合は、同パッケージが最優先だということがわかりました。
あまりクラス名は同じにしないほうがいいですね、と強く反省しました。
とりわけ、頻繁に使用するであろうビルドインクラスとは同じにしないほうがいいでしょう。

なので前述エセSpriteクラスはPlainSpriteと名を変えました...

CATEGORY