第19回 Objectクラスと静的メソッドの定義

第19回

  • 前回作ったスクリプトを改造すると。
  • そしてここで「クラスとは?」の謎に迫るさりげない発言が!

Objectクラスは,その使い方によって,いくつかの側面をもつ。今回は,配列(Arrayクラス)と似た,複数の値を収める容れ物として用いる。

  • いくつかの側面がありすぎるせいかイマイチつかめません、先生!

var myObject:Object = new Object();

配列は整数インデックスに値を格納した。Objectインスタンスには,インデックスでなく変数のように識別子をつけて値を代入する。識別子は,Objectインスタンスにドットシンタックスで以下のように設定すればよい。

myObject.hours = 12;
myObject.minutes = 34;
myObject.seconds = 56;
myObject.milliseconds = 789;

  • つまり書式が違うだけでほぼ配列、連想配列的な使い方ってことですね。
  • そしてミリ秒から時分秒を計算する関数が以下。

// フレームアクション
function translateToTimeObject(nTime:Number):Object {
 var oTime:Object = new Object();
 oTime.milliseconds = nTime%1000;
 nTime = Math.floor(nTime/1000);
 oTime.seconds = nTime%60;
 nTime = Math.floor(nTime/60);
 oTime.minutes = nTime%60;
 oTime.hours = Math.floor(nTime/60);
 return oTime;
}

  • ここでMath.floor()は小数点以下切り捨て。
  • さて次のページの静的なメソッドがよく分からない。

静的なメソッドは,Math.sin()やMath.cos()メソッドなどのように,インスタンスを作成することなくクラスを直接参照して呼出す*1インスタンスでなく,クラス自身に定義されたメソッドである。

  • うーん、スタティックなメソッド自体の意味はなんとなく分かるんだけど。
  • クラスにメソッドを定義する時はスタティックだと覚えておけばいいってこと?
  • そんなわけでASファイルはこんな感じ。

// ActionScript 3.0クラス定義ファイル: MyTimer.as
package {
 public class MyTimer {
  private var my_date:Date;
  public function MyTimer() {
   my_date = new Date();
  }
  public function getElapsedTime():Object {
   var current_date:Date = new Date();
   var nElapsedTime:Number = current_date.time-my_date.time;
   var oElapsedTime:Object = translateToTimeObject(nElapsedTime); // クラスの参照を省略
   return oElapsedTime;
  }
  public static function translateToTimeObject(nTime:Number):Object {
   var oTime:Object = new Object();
   oTime.milliseconds = nTime%1000;
   nTime = Math.floor(nTime/1000);
   oTime.seconds = nTime%60;
   nTime = Math.floor(nTime/60);
   oTime.minutes = nTime%60;
   oTime.hours = Math.floor(nTime/60);
   return oTime;
  }
 }
}

  • やっぱり属性指定で「static」にしてるな。
  • そんでこれを呼び出すフレームアクションは以下。

var myObject:MyTimer = new MyTimer(); ←クラスインスタンスの生成
stage.addEventListener(MouseEvent.CLICK, xTrace);
function xTrace(eventObject:MouseEvent):void {
 var oElapsedTime:Object = myObject.getElapsedTime();
 trace(oElapsedTime.hours);
 trace(oElapsedTime.minutes);
 trace(oElapsedTime.seconds);
 trace(oElapsedTime.milliseconds);
}

  • うーん、インスタンスのクラスってのがごっちゃになってきたー。
  • つーか、やっぱしクラスの概念がイマイチはっきりせんわー。

*1:「同じように,クラスを直接参照してアクセスする「静的なプロパティ」もある。たとえば,Math.PIがその例だ(厳密には,静的な定数とされる)。静的なプロパティやメソッドは「クラスプロパティ」および「クラスメソッド」とも呼ばれ,前出注の「インスタンスプロパティ」や「インスタンスメソッド」と対比される。」とある