前回の第20回はクラスMyTimerに修正を加えて、public属性のメソッドgetElapsedTime()がMyTimerInfoインスタンスを返すようにした(前回のサンプルファイルは、2ページからダウンロードできる)。MyTimerInfoクラスには時分秒ミリ秒をそれぞれ納めるint型のインスタンスプロパティが宣言され、数値でなければ設定できない(図1)。これらのプロパティを、もっときめ細かく管理できないだろうか。これが今回のテーマである。
プロパティを設定するメソッドの定義
たとえば、MyTimerInfoインスタンスのsecondsプロパティに、整数150を代入してみよう。データ型は正しいので、そのまま150が設定される(図2)。しかし、時間は60秒につき1分繰上がるのだから、できればminutesプロパティに120秒分の2分が加算され、secondsプロパティは30になってほしい。
プロパティsecondsの値をminutesに繰上げるには、設定のためのメソッドをMyTimerInfoクラスに用意することが考えられる。secondsプロパティを設定するメソッドは、クラス MyTimerInfo(前回のスクリプト2)にたとえばsetSeconds()としてつぎのように定義すればよい(他のプロパティは一旦脇に置く)。
MyTimerInfoインスタンス(oElapsedTime)に対して、このsetSeconds()により設定値の秒数を渡せば、60秒ごとに1分がminutesプロパティに繰上がる。たとえば、setSeconds()メソッドの引数に150秒を渡せば、プロパティminutesに2分が、secondsに30秒が設定される(図3)。
get/setアクセサメソッド
前項『プロパティを設定するメソッドの定義』に述べたとおり、メソッドを定義すればプロパティに対して単にデータ型の指定だけでなく、値の範囲を限定したり、他のプロパティの値と関連づけることができる。しかし、値を設定するという操作は、プロパティの方が端的でわかりやすい。ActionScript 3.0には、プロパティと同じアクセスの仕方で呼出せる特別なメソッドがある。それがgetおよびsetアクセサメソッドだ。
getおよびsetアクセサメソッドは、メソッドにgetおよびset定義キーワードを添えて、以下のように同じメソッド名で定義する。アクセサメソッドにはpublic属性を指定しつつ、内部的に用いるプロパティはprivateとするのが基本だ。
getとsetのアクセサメソッドには、プロパティと同じようにアクセスできる。つまり、MyTimerInfoクラスに秒数のprivateプロパティを_secondsで宣言し、getおよびsetアクセサメソッドをsecondsとして以下のように定義し直す(ここでも他のプロパティは一旦脇に置く)と、秒数のプロパティがsecondsであるかのようにアクセスできる(図4)。
それでは、改めてクラスMyTimerInfoにget/setアクセサメソッドを定義したい。前回のスクリプト2とは異なり、実際のインスタンスプロパティはprivate属性で指定するので、タイムラインから直接アクセスされることはない。代わりに、get/setアクセサメソッドがプロパティの役割を果たす。すると、実際のプロパティが時分秒ミリ秒の値をそれぞれもつ必要はない。
したがって、privateのインスタンスプロパティは総ミリ秒数のみを保持することとして、時分秒ミリ秒の値はアクセサメソッドの方で分ければよい[1]。そこで、つぎのスクリプト1のように総ミリ秒数のprivateプロパティはtotalMillisecondsとして宣言し、hours、minutes、seconds、millisecondsはアクセサメソッドとして定義した。
この仕様変更にともない、setTime()は時分秒ミリ秒をそれぞれ引数として受取るメソッドに定義し直し、総ミリ秒数のprivateプロパティtotalMillisecondsを設定することとした。各メソッドの処理内容は、前回までの説明で理解できよう。なお、setTime()メソッドはpublic属性にしたので、タイムラインから呼出して、時分秒ミリ秒をまとめて設定することも可能だ。
アクセサメソッドsecondsは、タイムラインからたとえばつぎのようなフレームアクションで試すことができる(図5)。
これでクラス定義の基本は、ひととおり解説した。次回からはお題を変えて、MovieClipシンボルにクラスを設定してみたい。
今回解説した次のサンプルファイルがダウンロードできます。