ObjectSquare [1999 年 1 月号]

[Happy Squeaking!!]


5.Squeak 演習:クラスを作成する

5.2 銀行口座インスタンスの生成、実行


それではワークスペースで、今作られた銀行口座クラスからインスタンスを生成して、メッセージを送ってみましょう。

| myAccount |
myAccount := Account new.
myAccount initialize.
myAccount deposit: 10000.
myAccount inspect.

2行目で、Accountクラスにnewメッセージを送りAccountインスタンスを生成させています。作られたインスタンスは、myAcccountという変数に代入されます。

以後はmyAccount変数に代入されたAccountインスタンスに対してメッセージが送信されていきます。

最初につくられた段階では、myAccountは

myAccount
id nil
money nil

になっています。
Initializeのメッセージが送られると、インスタンスは、自分のクラスで定義されたinisitlizeの動作を行います。

initilizeは定義によるとメソッドが
initialize
    id := 0.
    money := 0.

なので、起動後は、myAccountは

myAccount
id 0
money 0

になります。

次はdeposit: 10000 のメッセージ送信になります。
Accountクラスのメソッド定義に従い、Accountインスタンスは処理を行います。
deposit: newMoney
    money := money + newMoney.

のnewMoneyの部分に10000が入り起動されることになります。結果moneyの値が増えます。

起動後の、myAccountは

myAccount
id 0
money 10000

となります。こうしたインスタンス内部の処理は、カプセル化されており、外部からは見ることはできません。外部からは単に「なになにして」とメッセージを送るだけです。

今回作成した銀行口座ではメソッドの処理が非常に単純なのでそれほどのメリットは感じられないかもしれませんが、より複雑な処理を行うような場合には、この「内部の複雑な処理が見えない」というのは、呼び出し側にとっては煩雑で無関係な部分を気にせずにすむので利点がでてきます。何か少しの指示を出せば、オブジェクトが複雑な仕事をこなしてくれる、いわば「よきにはからえ」状態というわけです。

最後に、inspectメッセージが送られます。このメッセージによりインスペクタが開き、中身が確認できます。

実行後のAccountインスタンスの状態

次はインスペクタでなくトランスクリプトに残高の値を表示してみましょう。
文法の復習もかねてカスケードも使ってみます。Transcriptを開き、以下を実行しましょう。

| myAccount |
myAccount := Account new.
myAccount initialize;
    deposit: 10000;
    deposit: 2000;
    deposit: 300.
Transcript show: 'my account balance is ';
       show: myAccount getBalance printString.

セミコロンとピリオドの違いに注意しましょう。
また、最後のprintStringは、myAccount getBalanceの結果が数字オブジェクトなので、それを文字列に変換するために必要です。Transcript のshow: では文字列オブジェクトしか受け付けないのです。
メッセージの優先順位を思い出してください。myAccount getBalance printString のあとでTrnascript show: の実行になります。

SmallTip: 数字を文字列オブジェクトに変換するにはprintStringメッセージを使う

更につづく


© 1999-2001 OGIS-RI Co., Ltd.

Prev.

Index

Next