Section 2.3 メンバ変数とメソッド(その1)

今回はメンバ変数とメンバ関数について…って言ってもメンバ変数は前回使ったよね。
うん。メンバ変数ってクラスの定義の中で宣言されてる変数のことだよね。
そ。メンバ変数はオブジェクトの状態を表す要素だね。
で、メンバ関数の方はオブジェクトを操作する要素で、TJS ではよくメソッドって呼ばれてるね。
メソッドって System クラスとか Date クラスのを色々使ってきたよね。
うん。でも今回はメソッドを使うだけじゃなくて作ってみるからね。
メソッドってどうやって作るの?
作り方は基本的に普通の関数と同じ。
あと、メンバ変数はメソッドの中から参照したり書き換えたりできるよ。
じゃ、ちょっと作ってみるね。

<メンバ関数を使ったクラス定義の例(電卓の機能を持つ Calculator クラス)>

class Calculator
{
    var ans;  // 計算結果を格納するメンバ変数

    function Calculator()  // コンストラクタ
    {
        ans = 0;  // メンバ変数を初期化します
    }

    function finalize(){}  // デストラクタ(何もしません)

    // 計算式の入力を求めるメソッド
    // OK ボタンが押されると式の計算をした後 true、キャンセルボタンが押されると false を返します
    function calculate()
    {
        var expr = System.inputString("電卓""数式を入力してください。""");
        if(expr === void)
            return false;

        ans = expr!;  // 入力された式の値を計算して ans に代入します

        return true;
    }

    // 計算結果の値を返すメソッド
    function getAnswer()
    {
        return ans;
    }
}

これってどんなクラスなの?
Calculator クラスは簡単な計算ができる電卓の機能を持つクラスなんだ。
メソッドは calculategetAnswer
ん、そう。calculate メソッドは入力された数式の計算をする関数で、 getAnswer メソッドが計算結果を返す関数だよ。
じゃ、まずは calculate メソッドから見てくね。
うん。
calculate メソッドの最初でやってることは解るよね?
inputString メソッドを使って、計算式を入力するウィンドウを表示してるんだよね。
それで、入力された文字列を expr っていう変数に代入してるね。
そうそう。
もしキャンセルボタンが押されたら exprvoid になるから、false を返して終了。
えっと、次の式がよくわからないんだけど…
! 演算子って、値が右側にくるんだったよね?
なのにこれ変数が左側にあるよ?
実はこれ §1.9 の論理否定演算子とは全く別の演算子なんだ。
えっ、そうなの?
値が左側にくる方の ! 演算子、つまり後置の ! 演算子は式評価演算子って言って、 左側の値を文字列とみなして、さらにその文字列を式とみなして計算する演算子なんだ。
えっと、ちょっとよくわかんないんだけど…
ん〜、じゃこれ実行してみて。

<式評価演算子(後置 ! 演算子)の使用例>

System.inform("1 + 1"!);

2」って表示されたね。
式評価の ! 演算子の左側は "1 + 1" っていう文字列になってるでしょ。
うん。
式評価の ! 演算子はこれを式とみなして計算するから、 1 + 1 の計算結果の『2』が表示されたってワケ。
あ、なるほどね。
だから式評価 ! 演算子を使うと簡単に数式の計算ができるんだ。
へぇ…便利な演算子だねぇ。
ただし、このスクリプトは式が正しいかどうかのチェックを全然してないから、 値が計算できないような式を入力すると例外が起こるから気をつけてね。
値が計算できない式ってどんなの?
例えば『a+b』みたいに数字以外の値が入ってる式とか、 『1#2』みたいに演算子として使えない記号が入ってる式とかだよ。
じゃあ、数字と演算子だけだったら OK ってことなの?
ん、そういうこと。
だから 12*(34+56) みたいなのは OK。
うん、わかった。
ホントは式評価の ! 演算子は、変数とか関数が入ってる式も計算できるんだけど、 ややこしくなるからここでは詳しい説明はパスするね。
りょーかい。
じゃ calculate メソッドの話に戻るね。
calculate メソッドは入力された式が計算できたら、計算結果をメンバ変数 ans に代入して true を返すんだ。
キャンセルされたら false を返すから、calculate メソッドの戻り値を調べれば、式が入力されたかキャンセルされたかが判るんだね。
ん、そういうこと。
次は getAnswer メソッドだけど、これは簡単だよね。
計算結果が入ってるメンバ変数 ans の値を返してるんだよね。
ん、そう。
これでメソッドの作り方はだいたい解った?
うん、おっけーだよ。普通の関数とほとんど同じみたいだし。
それじゃ、次はメソッドを呼び出す方ね。

Calculator クラスの使用例>

// Calculator クラスのオブジェクトを作成します
var calc = new Calculator();

// 計算式の入力を求めて、入力されれば計算結果を表示します
if(calc.calculate())
    System.inform(calc.getAnswer(), "計算結果");

invalidate calc;  // 不要になったので無効化します

まずは実行してみよっか。
Calculator クラスの定義の後にこのスクリプトを追加して、実行してみて。
は〜い!

数式の入力ウィンドウ

入力ウィンドウが表示されたね。
何か適当な数式を入力して OK ボタンを押してみて。
えっと…じゃあ『(1+2)*3』って入力して、OK。

計算結果

うん、(1+2)*39 だから、これで合ってるよね。
ん、ちゃんと計算できたみたいだから、次はスクリプトの方を見ていくね。
えっと、最初に calc っていう名前の Calculator クラスのオブジェクトを作ってるんだよね。
そうそう。
で、メソッドを呼び出す時は『クラス名.メソッド名(引数)』って書けば OK。
ってことは、if の条件式のところで calculate メソッドを呼び出してるんだね。
そ。だからここで入力ウィンドウが表示されるね。
えっと、calculate メソッドは OK ボタンが押されると true を返すんだから、 OK ボタンが押されたら、次の inform メソッドが呼び出されるんだよね?
ん、OK ボタンが押された場合は入力された式の値が計算されて、メンバ変数 ans に格納されてるから…
inform メソッドの第1引数のところで getAnswer メソッドを呼び出すと、 第1引数が ans の値に置き換わって、計算結果が表示されるんだね。
そう。これで calc は使い終わったから、最後に無効化して終わり。
…まぁこの場合は別に無効化しなくてもいいんだけどね。
え、そうなの?
Calculate クラスのデストラクタは何もしてないからね。
あ、確かにそうだね。
じゃあ、そういう場合は無効化しなくてもいいってこと?
ん、今回みたいな場合は省略しても OK。
でも、要らなくなったら無効化するのを心がけるのは良い事だと思うよ。
うん、そだね。
これでこのスクリプトの動作は解った?
うん、ばっちり!
じゃあ今回はここまでにしよっか。
次回は §1.20 のスクリプトを使って時計クラスを作ってみるよ。
それじゃまた次回ね!


前へ | TOP | 次へ