前回はクラスの便利な点の一つ目として,「お気に入りの処理をまとめて使いやすくしたもの」という点をご紹介しました。今回は二つ目として「たくさんの情報を整理整頓して管理できる」点をご紹介します。効率よくプログラミングをするのに,とても役立つ仕組みですので,しっかりマスターしてください。

クラスとインスタンス

 この機能を支えるのが「インスタンス」という仕組みです。そう,今までの学習でもたくさん使ってきたあのインスタンスです。ほとんどのクラスは,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の値が保存されている