« ビルトインクラスの拡張 | メイン | オーバーライド/ポリモーフィズム »

静的(static)クラスの拡張

次に静的(static)クラスを拡張する方法を紹介します。ActionScriptユーザーガイドには「TextField クラスや、Math、Key、Mouse などの静的クラスを拡張することはできません。」と書いてありますが、やり方によってはこれらのビルトインクラスの静的クラスも拡張できます。次の例ではMathクラスをスーパークラスとしたYoMathTestクラスを作り、数値を指定の桁数に四捨五入するyoRound()関数を追加します。スクリプトで使っているMath.pow(a,b)メソッドはaのb階乗を返す関数です。

sample→ex04-03/yoMathフォルダ

クラス定義ファイル:YoMathTest.as
//Mathクラスを拡張する
class YoMathTest extends Math {
//コンストラクタ
function YoMathTest() {
}
//指定の桁数にまるめる
function yoRound(v:Number, keta:Number) {
var tmpV = v * Math.pow(10, keta);
var ans = Math.round(tmpV) / Math.pow(10, keta);
return ans;
}
}

yoRound()関数を使って12.345を小数点以下2桁に四捨五入してみると12.35になることがわかります。

フレームアクション:yomathtest.fla
myObj = new YoMathTest();
x = myObj.yoRound(12.345,2)
trace(x); // 出力→ 12.35

しかし、Mathクラスのround()関数はMath.round()の書式で利用できます。これと同じようにyoRound()関数を利用できるようにするには、次のようにstaticキーワードでyoRound()関数をクラスメンバー(静的メンバー)に指定します。クラスのインスタンスを作らずにメンバーを利用することから、コンストラクタ関数もアクセスできないようにprivateに指定します。

クラス定義ファイル:YoMath.as
//Mathクラスを拡張する
class YoMath extends Math {
//コンストラクタ--privateにする
private function YoMath() {
}
//指定の桁数にまるめる--staticにする
static function yoRound(v:Number, keta:Number) {
var tmpV = v * Math.pow(10, keta);
var ans = Math.round(tmpV) / Math.pow(10, keta);
return ans;
}
}


YoMathクラスのyoRound()関数はインスタンスを作らなくても利用できます。

フレームアクション:yomath_1.fla
y = YoMath.yoRound(12.345,2)
trace(y) // 出力→ 12.35

ただ、これではYoMathクラスが本当にMathクラスを継承しているのかどうか判断できません。そこで、次のテストを行ってみます。次のスクリプトのYoMath.PIは、スーパークラスのMath.PIを参照します。このようにYoMathはMathクラスのメンバーを利用できることがわかります。

フレームアクション:yomath_2.fla
Math; // ←スーパークラスを参照しておく
pi = YoMath.yoRound(YoMath.PI, 2);
trace(pi); // 出力→ 3.14

このフレームアクションにおいてMathクラスを一度呼び出している理由は、タイムラインでは先にスーパークラスにアクセスした後からでないとスーパークラスのクラスメンバーの参照に失敗してしまうからです。この点に注意が必要です。
これでYoMathクラスがMathクラスを継承していることを確認できましたが、ビルトインクラスの静的クラスはいつでもどこからでも利用できることから、わざわざ継承して使う意味はあまりないかもしれません。

投稿者 oshige : 2005年2月23日 10:37