ObjectSquare [1999 年 4 月号]

[Happy Squeaking!!]


5.Squeak演習: インターセッション

5.3 メタクラス・クラスを支えるもの つづき


クラス自身の振る舞い-クラスメソッドの定義

ブラウザでは、クラスに操作の定義を付け加えることで、インスタンスの振る舞いを付け加えることができました。同様にメタクラスに操作の定義をつけ加えることで、クラス自身の振る舞い(クラスメソッド)を決めていくことができます。
(ブラウザの"instance"、"class"の表示は、一見紛らわしいですが、インスタンスとクラスの振る舞いの仕方と考えるとすっきりします)。

クラスの振る舞いで典型的なのは、インスタンスの生成の仕方を決めることです。今までは、あまり意識することもなく、クラスに対し、newメッセージを送ってきましたが、この振る舞いをメタクラスに定義することで変更ができるのです。

ブラウザによれば、OrderedCollectionの場合は、既に3つの生成用の操作が定義されていることが確認できます。

拡大図(GIF, 3KB)
OrderedCollectionメタクラスに定義されたインスタンス生成操作を見る

ここでは、OrderedCollectionのインスタンス生成操作の詳しい解説はしません。new: は初期サイズを指定したインスタンス生成。newFrom:は初期データを指定したインスタンス生成を提供しています。

では、演習としてAccountクラスが、Accountインスタンスを自らのやり方で生成できるようにしていきましょう。

Accountクラスのブラウザを開き、"class"側にブラウザを合せます。インスタンス生成はクラスが行なうことです。クラスの振る舞いの仕方(メソッド)はメタクラスに定義されるのです。

メッセージカテゴリ、"instance creation"を追加します。

拡大図(GIF, 4KB)
instance creation メッセージカテゴリの作成

instance creationカテゴリ下に、new メソッドを以下のように定義します。

new
        ^super new initialize.

super newで上位で定義されたnewを利用し、インスタンスを生成しています。次に生成されたインスタンスに対してinitializeメッセージを送り、インスタンスを初期化して、返り値としています。

このようにインスタンス生成の操作をクラスに与えてあげることによって、Accountインスタンスの利用者は、インスタンス生成のあとでいちいちinitializeを送ってあげる必要がなくなります。

| acc opNames |
acc := Account new. "Accountインスタンス生成"
"acc initialize." "<<==new内部で送られるので不要"
acc deposit: 1000.

従って上記のように、initializeを送る部分をコメントアウトしても大丈夫になったわけです。

更につづく


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

Prev.

Index

Next