前回の第19回「Objectクラスと静的メソッドの定義」では、MyTimerクラスに手を加え、getElapsedTime()メソッドがObjectインスタンスを返すようにした(図1)。今回は、さらに新たなクラスを定義して、MyTimerクラスと組合わせて使ってみたい(前回のサンプルファイルは2ページからダウンロードできる)。なお、今回から新発売のFlash CS4 Professionalを用いることにする[1]。
情報を収めるクラスの定義
MyTimerクラスのgetElapsedTime()メソッドが返すObjectインスタンスは、さまざまなプロパティ値が自由に設定できる。しかし反面、その自由さが問題でもある。たとえば、クラス定義(AS)ファイルと同階層に保存したFlashムービー(FLA)ファイルにつぎのようなフレームアクションを記述すれば、getElapsedTime()メソッドの戻り値であるObjectインスタンスにnameという名前のプロパティを設定したり、数値を納めるつもりのプロパティhoursに文字列が代入できてしまう(図2)。
設定できるプロパティやそのデータ型を指定するには、カスタムクラスを定義すればよい。クラス名はMyTimerInfoとし、数値のインスタンスプロパティとしてhours、minutes、seconds、 millisecondsを宣言する。すると、クラスMyTimerInfoの大枠は、つぎのように定義されよう。なお、各プロパティは整数のint型で指定した。
このMyTimerInfoクラスのインスタンスには、宣言した以外のプロパティは設定できない(図3)。また、もちろん代入できる値は、データ型として指定した数値のみだ[2]。
MyTimerクラスからMyTimerInfoクラスを使う
クラスMyTimerInfoには、さらにメソッドも加えたい。しかしその前に、MyTimerクラスのメソッドgetElapsedTime()に修正を加えて、戻り値はObjectでなくMyTimerInfoインスタンスにしておこう(スクリプト1)。また、MyTimerInfoクラスに新たに定義するメソッドについても、MyTimerクラスからどのように使いたいのかを先に決めてしまうことにする。
第1に、getElapsedTime()メソッドの戻り値とその値を納める変数(elapsedTime)のデータ型は、上述のとおりクラスMyTimerInfoで指定した。
そして第2に、MyTimerInfoインスタンスを生成するコンストラクタメソッドの呼出しに、引数として経過時間のミリ秒数(nElapsedTime)を渡している。これは、MyTimerInfoクラスが渡されたミリ秒数をもとに時分秒ミリ秒の値を計算して、各ブロパティに設定することを想定した。したがって、MyTimerクラスにはそれらの数値を計算するメソッドtranslateToTimeObject()は要らなくなる。
すると、MyTimerInfoクラスは、以下のように修正される(スクリプト2)。コンストラクタメソッドがミリ秒数の数値を受取り、それを新たに定義したメソッドsetTime()に渡す。そして、 setTime()メソッドはミリ秒数から時分秒ミリ秒を計算して、各インスタンスプロパティに値を設定するのだ。
setTime()メソッドの処理内容は、基本的にMyTimerクラスに定義されていた静的(static)なメソッドtranslateToTimeObject()と同じなので、とくに説明は要らないだろう[3]。なお、setTime()は静的メソッドでなくインスタンスメソッドとし、private属性を指定した。
前回と同じく[4]、Flashムービーファイルにつぎのようなフレームアクションを記述すれば、ステージをクリックするたびに、MyTimerインスタンスを生成してから経過した時分秒ミリ秒が[出力]パネルに表示される(図4)。
次回は、MyTimerInfoクラスにさらに手を加えるつもりだ。
今回解説した次のサンプルファイルがダウンロードできます。