図1: パッケージの仕組み(クリックすると別ウィンドウでムービーを表示します)
適切なパッケージ名を付けることで,クラスを利用する際に「あ,このパッケージに入っているクラスはたぶんあんなことができるんだろうな」とわかりやすくなります。また,パッケージで切り分けることで,同名のクラスがある場合でも,異なるパッケージに配置することで,クラス名の衝突を避けることができます。
パッケージの仕組みとクラスパス
では,実際にパッケージの仕組みを使ってみましょう。まずは図2を見てください。二つの「Cardクラス」がありますね。一つ目は,カード・ゲームを想定して作ったCardクラス,そして二つ目は,カード型データベースを想定して作ったCardクラスです。
図2: 二つのCardクラス
この二つのCardクラスを保存しようとすると,ちょっと困ったことになりますよね。そうです。ActionScriptでは,クラス名とファイル名は同一のものにしなくてはいけません。でも,同じフォルダ内には同じ名前・拡張子のファイルは保存できませんよね。
そこで,二つのフォルダを作成し,そこにそれぞれのCardクラスを保存してみました。この際,それぞれのフォルダ名はわかりやすいように「cardGame」と「tinyDatabase」としてみました(図3)。
図3: 別々のフォルダにクラス・ファイルを保存
また,それぞれのクラス定義は「tinyDatabase.Card」と「cardGame.Card」と,「フォルダ名.クラス名」という形に変更します。このようなフォルダ名を含めたクラスの記述を「完全修飾クラス名」形式と呼びます(*1)。
これで二つのCardクラスを保存できました。では,このCardクラスを使用するには,どうすればよいのでしょうか?今までのように,クラス・ファイルを保存しているディレクトリにFlashドキュメントを作成し,そこから利用するしかないのでしょうか?
答えは「いいえ」です。実は,「どこの場所のクラスを使うのか」という指定は,importステートメントと「クラスパス」という仕組みを使って指定できるのです。
では,実際に,クラスパスを使って使用するクラス・ファイルを指定してみましょう。二つのフォルダと同じ場所にFlashドキュメントを作成し,保存します(図4)。
図4: Flashドキュメントの作成
Flashドキュメントの1フレーム目に,次のようなコードを記述します。
//cardクラスをインポート import cardGame.Card; //Cardクラスのインスタンスを生成 var _card:Card = new Card();
このコードの実行結果は,図5のようになります。「cardGame」フォルダ内のほうのCardクラスが利用されていることが確認できますね。
図5: クラスパスの利用
では,コードのimportステートメントの部分を次のように変更し,実行してみるとどうなるでしょうか?
//cardクラスをインポート import tinyDatabase.Card; //Cardクラスのインスタンスを生成 var _card:Card = new Card();
結果は,図6のようになります。今度は「tinyDatabase」フォルダ内のほうのCardクラスが利用されていることを確認できますね。
図6: クラスパスを切り替える
このように,「どこのクラスを使用するか」というのは,クラスパスを使用して指定できます。クラスパスの記述形式は,フォルダの階層を「.」(ドット)で区切って指定します。
import フォルダ名.クラス名;
このとき,クラス・ファイルを保存しているフォルダ(フォルダ名)のことを「パッケージ」と呼びます。
import パッケージ名.クラス名;
cardGameフォルダは,ActionScriptから見ると「cardGameパッケージ」,tinyDatabaseフォルダは「tinyDatabaseパッケージ」というように見るわけですね。