クラスとインスタンス
この機能を支えるのが「インスタンス」という仕組みです。そう,今までの学習でもたくさん使ってきたあのインスタンスです。ほとんどのクラスは,new演算子を使って「インスタンス」を生成できます。インスタンスは,インスタンスごとに独自の変数である「インスタンス変数」を保持することができます。インスタンス変数の多くは「プロパティ」として認識され,利用できます。図1は,「インスタンス」の仕組みをジンジャーマン・クッキー(*1)というクッキーの作り方になぞらえて説明したムービーです。
図1: インスタンスで情報を管理するイメージ(クリックするとムービーを表示します)
だいたいのイメージはつかめましたでしょうか?(*2) では,実際にカスタム・クラスを使ってインスタンス,そして,プロパティを使ってみましょう。
カスタム・クラスを使ったインスタンスの作り方
それでは,クラス・ファイルを使ったカスタム・クラスのインスタンスの利用方法を見ていきましょう。サンプルとして,何枚かのカードを用意し,カードの値を使って対戦するカードゲームのようなものをイメージしてみてください。カードゲームを作成するには,もちろんカードが必要ですよね。それも,複数枚必要です。このカードの情報を,クラス・ファイルとインスタンスを使って管理してみましょう。「複数の同じフォーマットの情報を管理する」という用途において,クラス・ファイルとインスタンスという仕組みは非常に便利なのです。
まずはカードを管理するクラス「MagicianCard」クラスを作成し,Flashドキュメントと同じフォルダ内に保存しておきます。
図2: MagicianCardクラスの定義
MagicianCard.asの内容は次のようにしてください。
class MagicianCard{ //確認用メソッド。必ず「10」を返す。 function getDamage():Number{ return 10; } }
MagicianCardクラスには,必ず「10」を返す「getDamageメソッド」を用意しておきます。
では,Flashドキュメントからカスタム・クラス「MagicianCard」のインスタンスを生成し,利用してみましょう。カスタム・クラスのインスタンスを生成するには,ビルトイン・クラスのインスタンスを生成するのと同様,new演算子を使用します。
//クラスをインポートして使用準備 import MagicianCard; //変数「myCard」にMagicianCardクラスのインスタンスを格納 var myCard:MagicianCard = new MagicianCard(); //きちんとインスタンスが生成されたかメソッドを呼び出して確認 trace("ダメージの値は、"+myCard.getDamage());
図3: メソッドの実行結果
new演算子によって新規のインスタンスが生成され,定義しておいたメソッドが実行されたことが確認できましたね(図3)。
では,このカードに「攻撃力」を持たせてみましょう。攻撃力を管理する変数名は「magicPower」とします。Flashドキュメントのコードとしては,こんな感じでしょうか。
import MagicianCard; var myCard:MagicianCard = new MagicianCard(); //変数「magicPower」の値に「5」を設定 myCard.magicPower = 5; //値がきちんと保存されているかをチェック trace(myCard.magicPower);
しかし,このコードを実行してみると,図4のようなエラーが出力されます。
図4: 出力されるエラー
エラーの内容を見てみると,なにやら「magicPower」という「プロパティ」が無いとのことです。
実はカスタム・クラスは,使いたい変数はあらかじめクラス・ファイル側で宣言しておかなくてはいけないのです(*3)。クラス・ファイル側で使用したい変数を宣言するには,Flashドキュメントのタイムラインで変数を宣言するのと同様に,varステートメントを使用して宣言します。
MagicianCard.asの内容を次のようにvarステートメントを使って,変数「magicPower」の宣言を追加してみましょう。
class MagicianCard{ //インスタンス変数を宣言 var magicPower:Number; //「magicDamage」の値に10を加算して返すメソッド function getDamage():Number{ return magicPower + 10; } }
また,getDamageメソッドも,変数magicPowerの値に10を加算した値を返すように変更してみました。このMagicCard.asの変更を保存したら,Flashドキュメントに戻り,もう一度先ほどのコードを実行してみましょう。すると今度は,エラーは出力されませんね。さらに「myCard.magicPower」と,「インスタンス名.変数名」という記述で,きちんとmagicPowerの値として「5」が保存されていることが確認できます。
さらに,Flashドキュメント側のコードに,
//きちんとインスタンスが生成されたかメソッドを呼び出して確認 trace("ダメージの値は、"+myCard.getDamage());
と続けて記述すると,変数magicPowerの値を使って計算した結果である「15」という値が表示されます(図5)。
図5: 変数magicPowerの値が保存されている