ObjectSquare [1999 年 1 月号]

[Happy Squeaking!!]


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

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


クラスはインスタンスの工場ですので、インスタンスを幾つでも生成することができます。
例として、以下のコードを実行("do it")してみましょう。

MyAcc1 := Account new.
MyAcc1 initialize;
    deposit: 10000.
MyAcc2 := Account new.
MyAcc2 initialize;
    deposit: 2000.

Accountクラスから二つのAccountインスタンスを生成しています。
今回はいつものようにテンポラリ変数として変数を定義していません。従って"do it"の途中で、「グローバル変数にするか」と聞いてきます。「する」と答えて続けましょう。

グローバル変数の定義

グローバル変数は、テンポラリ変数と違い、実行後にすぐ消えさってしまうのではなく、Smalltalk(Squeak)のイメージファイルの環境が存在しつづける限り、その値が保たれます。Smalltalkでは、グローバル変数は通常クラスを格納するために使われます。また、まれによく使うインスタンスがグローバル変数に入っていることもあります。先ほどから使われているTranscriptがその例です。今回はMyAcc1とMyAcc2の属性の値を幾つかの実行に分けて観察したいのであえてこグローバル変数を使う方法をとっていますが、モジュール化の観点から多用は避けるべきです。

Smalltalkでは、グローバル変数は、通常の変数との区別をつけるために大文字始まりになるのが習慣です。

SmallTip: グローバル変数は大文字で始まる

インスタンスは個々の実体として存在するのでそれぞれの属性値は違いに影響をうけることはありません。

MyAcc1、MyAcc2をそれぞれインスペクトしてみましょう

グローバル変数なので、直接選択してインスペクトできます。ポップアップメニューで "inspect it "を選択します。

グローバル変数を直接inspect

MyAcc1、MyAcc2の両方のインスペクタを開くと、互いが別個の属性値を持っていることが確認できます。

拡大図(GIF,19KB)

2つのAccountインスタンス

続いて、MyAcc1、MyAcc2にdeposit:メッセージを送ります。

MyAcc1 deposit: 1111.
MyAcc2 deposit: 222.

インスペクタを再びみると値が書き換わることが確認できます。(インスペクタの表示をアップデートさせるため、リストの選択をし直してください。)

拡大図(GIF,20KB)

値の書き換わった2つのAccountインスタンス

一方でどのような属性を持つかという定義、および操作に対応した動作の仕方(メソッド)はクラスに記述され共有されていることになります。

両方のインスタンスからクラスをたどり、ブラウズしてみることにしましょう。

以下を一文づつ順番に実行します。
Browser newOnClass: MyAcc1 class.
Browser newOnClass: MyAcc2 class.

MyAcc1、MyAcc2の別個のインスタンスに対して、それぞれにclassメッセージを送って「あなたのクラスは?」と尋ねています。結果としてブラウザは、同じAccountクラスを引数として受け取って表示します。

拡大図(GIF,54KB)

Accountインスタンスは同じ定義情報から生成されている

SmallTip: インスタンスに対して、生成したクラスを問い合わせるには"class"メッセージを用いる

クラスとインスタンスについて大体イメージが湧きましたでしょうか。
余裕のあるかたは以下の課題にチャレンジしてみてください。

課題1: Accountクラスに"引き出し"、"id設定"の操作を追加する。

### ### ### ### ### ### ### ### ### ### ### ### ### ###

さて、盛り上がってきたところですが紙面の都合で今回はここまでです。
次回は継承とポリモルフィズムの解説に入ります。お楽しみに。


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

Prev.

Index

Next