今回はたくさんのクラス・ファイルを整理し,さらに,同じような用途のクラスをまとめることによって,「そのクラス群がどんな時に使ってもらいたくて作ったのか」をわかりやすくする「パッケージ」の仕組みをご紹介します(図1)。

図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パッケージ」というように見るわけですね。