ActionScript 3.0で始めるオブジェクト指向スクリプティング

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

この記事を読むのに必要な時間:およそ 2 分

静的なメソッドを定義する

それでは,クラスMyTimerにtranslateToTimeObject()をメソッドとして定義しよう。問題はその定義の仕方だ。通常は,getElapsedTime()メソッドのように,インスタンスを参照して呼出すメソッドとして定義する※1)⁠ところが,translateToTimeObject()は,インスタンスを参照する必要性がない。引数として渡された数値に算術演算を施して返すだけで,インスタンスのプロパティなどの情報がまったく要らないからだ。

このような場合,クラスの「静的staticなメソッド」として定義することが考えられる。静的なメソッドは,Math.sin()Math.cos()メソッドなどのように,インスタンスを作成することなくクラスを直接参照して呼出す※3)⁠インスタンスでなく,クラス自身に定義されたメソッドである。今回,translateToTimeObject()は,クラスMyTimerの静的メソッドとして定義しよう。

静的なメソッドは,その定義に属性としてstaticを指定するスクリプト2)⁠静的なメソッドはそれが汎用的であれば,他のクラスやフレームアクションから利用する場合も少なくない。そこで,translateToTimeObject()メソッドも,アクセス制御の属性にはpublicを指定した。以上ふたつの属性の指定を除けば,メソッドの定義は前述フレームアクションの関数(スクリプト1)と変わるところはない。

スクリプト2 MyTimerクラスに静的メソッドtranslateToTimeObject()を定義

// 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;
    }
  }
}

静的メソッドは,クラスを参照して呼出す。ただし,クラス自身の内部からアクセスする場合には,前記スクリプト2のようにクラスの参照は省略できる。translateToTimeObject()メソッドにはpublic属性を指定したので,Flashムービー(FLA)ファイルから呼出せる。たとえば,つぎのようなフレームアクションでテストしてみるとよいだろう。

var myObject:Object = MyTimer.translateToTimeObject(45296789);
trace(myObject.hours);   // 出力: 12
trace(myObject.minutes);   // 出力: 34
trace(myObject.seconds);   // 出力: 56
trace(myObject.milliseconds);   // 出力: 789

以下のようなフレームアクションを記述すれば,ステージをクリックするたびに,MyTimerインスタンスを生成してから経過した時分秒ミリ秒が[出力]パネルに表示される

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);
}

図3 クリックしたときの経過時間の時分秒ミリ秒が[出力]

図3 関クリックしたときの経過時間の時分秒ミリ秒が[出力]

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

今回解説した次のサンプルファイルがダウンロードできます。

著者プロフィール

野中文雄(のなかふみお)

ソフトウェアトレーナー,テクニカルライター,オーサリングエンジニア。上智大学法学部卒,慶応義塾大学大学院経営管理研究科修士課程修了(MBA)。独立系パソコン販売会社で,総務・人事,企画,外資系企業担当営業などに携わる。その後,マルチメディアコンテンツ制作会社に転職。ソフトウェアトレーニング,コンテンツ制作などの業務を担当する。2001年11月に独立。Web制作者に向けた情報発信プロジェクトF-siteにも参加する。株式会社ロクナナ取締役(非常勤)。

URLhttp://www.FumioNonaka.com/

著書