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

第18回 カスタムクラスを定義する

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

プロパティとメソッドを定義する

それでは新たなクラスを定義して,簡単なプロパティとメソッドを加えてみよう。クラス名はMyTimerとし,getTimer()関数と同じような,経過時間が調べられるメソッドを備える。時間のスタートは,クラスMyTimerのインスタンスを生成したときとする。

var myObject:MyTimer = new MyTimer();

そして,MyTimerクラスにメソッドgetElapsedTime()を定義して,インスタンスが生成されてから経過した時間をミリ秒で返そう。関数を定義する場合と同じく,クラスの定義も,その利用の仕方から考えるとデザインしやすい。

var nTime:Number = myObject.getElapsedTime();
trace(nTime);   // 出力: 経過ミリ秒

すると,インスタンスが生成された時刻を,プロパティに保持しておく必要がありそうだ。そのプロパティ名はmy_dateとし,コンストラクタメソッドが呼出されたときに,Dateインスタンスを生成して代入する。他方,getElapsedTime()は,呼出されたときに新たなDateインスタンスを生成する。そのうえで,そのDateインスタンスとプロパティmy_dateのDate.timeプロパティ値の差を取れば,経過ミリ秒数は計算できる。

以上の考え方で定義したクラスMyTimerが,つぎのスクリプト2だ。

スクリプト2 プロパティとメソッドを定義したクラスMyTimer

// ActionScript 3.0クラス定義ファイル: MyTimer.as
package {
  public class MyTimer {
    private var my_date:Date;
    public function MyTimer() {
      my_date = new Date();
    }
    public function getElapsedTime():Number {
      var current_date:Date = new Date();
      var nElapsedTime:Number = current_date.time-my_date.time;
      return nElapsedTime;
    }
  }
}

処理の内容そのものは,上記の説明で十分だろう。ここで解説を加えたいのは,var宣言やfunction定義の前につけたアクセス制御の属性privateおよびpublicである。

これらはclass定義キーワードの前に添えたpublic属性と同じく,プロパティやメソッドに対して,どこからのアクセスを認めるかという,いわば公開範囲の指定だ。publicは,classで説明したとおり,すべてのクラスやタイムラインからのアクセスを許す。したがって,メソッドgetElapsedTime()は,フレームアクションから呼出すことができる。privateはもっとも閉鎖的な指定で,それを宣言・定義したクラス内からしかアクセスできない表1※4)⁠

表1 アクセス制御の属性キーワード(一部)

アクセス制御の属性 説明
private 定義されたクラス内からのみ,アクセスすることができる。
public 任意のクラスやタイムラインから,アクセスすることができる。コンストラクタメソッドは,このpublic属性しか指定できない。

たとえば,フレームアクションからMyTimerインスタンスに対して,privateプロパティmy_dateにつぎのようにアクセスしようとすれば,[コンパイルエラー]が生じる図5)⁠private属性を指定したプロパティは,外部から直接値を取得・設定されないことが保障されるのだ。

var myObject:MyTimer = new MyTimer();
trace(myObject.my_date);   // コンパイルエラー

図5 private属性のプロパティに外部からアクセスすると[コンパイルエラー]が発生

図5 private属性のプロパティに外部からアクセスすると[コンパイルエラー]が発生

メソッドgetElapsedTime()はpublic属性の指定なので,もちろんフレームアクションから呼出せる※5)⁠テスト用につぎのようなフレームアクションを記述すれば,ステージをクリックするたびに,MyTimerインスタンスを生成してから経過した時間がミリ秒で[出力]パネルに表示される※6)⁠

var myObject:MyTimer = new MyTimer();
trace(myObject);   // 出力: [object MyTimer]
stage.addEventListener(MouseEvent.CLICK, xTrace);
function xTrace(eventObject:MouseEvent):void {
  var nElapsedTime:Number = myObject.getElapsedTime();
  trace(nElapsedTime);
}

図6 [出力]パネルにMyTimerインスタンスと経過ミリ秒数が表示

図6 [出力]パネルにMyTimerインスタンスと経過ミリ秒数が表示

これで,ごく単純なクラスが定義できた。次回は,このクラス定義に,もう少し手を加えてみることにしよう。

※4
ActionScript 2.0のprivate属性は,クラス内だけでなく,そのクラスを継承したサブクラスからもアクセスできる。ActionScript 3.0では,この仕様が変わった。サブクラスからのアクセスを含めたい場合には,protected属性を指定する。
※5
アクセス制御の属性を指定しないプロパティやメソッドは,デフォルトとしてinternal属性が指定されたものとみなされる。これは,同じパッケージ(package)内のクラス同士でしかアクセスできない指定になる。ただし,コンストラクタメソッドには,public属性しか指定できず(前掲表1参照)⁠デフォルトも当然publicになる。
※6
InteractiveObject.clickイベント(定数MouseEvent.CLICK)のリスナー関数は,Stageインスタンス(DisplayObject.stageプロパティ)に登録した。こうすると,キーイベントの場合第13回「キーボードによる操作」参照と同じく,ステージ上のどこをクリックしてもマウスイベントが発生する。

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

著者プロフィール

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

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

URLhttp://www.FumioNonaka.com/

著書