ObjectSquare [1999 年 4 月号]

[Happy Squeaking!!]


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

5.5 インターセッション応用

Interfaceのメタモデルの追加 つづき 2


次はextendsの簡易版として、複数Interface間の融合(MixIn)を作ってみます。
これにより複数の異なるInterfaceから、両者の操作リストを混ぜ合わせた新たなInterfaceを作ることができるようになります。

(Interface >> actionsカテゴリ)
mixIn: anInterface
        | newNm newOpList newIf |
        newNm := self name, ' + ' , anInterface name.
        newOpList := Set new.
        newOpList addAll: self operationList; 
                       addAll: anInterface operationList.
        newIf := self class name: newNm operationList: newOpList.
        ^newIf

新しく出てきたのはaddAll: です。これは、集合オブジェクトに、要素一つ一つでなく、別の集合オブジェクトの要素をまとめて追加されるのに利用されます。

SmallTip: 集合オブジェクトに、別の集合オブジェクトの要素をまとめて追加する場合には、addAll:を用いる

mixIn: の引数はInterfaceのインスタンスです。受取った側ではそこから名前と操作リストを取り出し、自分の名前、操作リストとそれぞれ融合を行ない、その値を設定した新たなInterfaceのインスタンスを生成し、呼び出し側に返します。

MixInの実行例は以下のようになります。

| accIf prtIf mixIf |
accIf := Interface name: #IAccount operationList: #(#deposit: #getBalance 
#withdraw:).
prtIf := Interface name: #IPrintable operationList: #(#printString).
mixIf := accIf mixIn: prtIf. "IAccountとIPrintableのMixInの生成"
Transcript cr; show: mixIf name.
Transcript cr; show: mixIf operationList printString.

インターフェース名、および操作名の集合が融合されたMixIn Interfaceができたことが確認できます。


MixIn Interfaceの表示

それではMixIn Interfaceを実際に使ってみましょう。

"inspect it"
| accIf prtIf mixIf acc ord |
accIf := Interface name: #IAccount operationList: #(#deposit: #getBalance 
#withdraw:).
prtIf := Interface name: #IPrintable operationList: #(#printString).
mixIf := accIf mixIn: prtIf.
acc := Account new.
ord := OrderedCollection new.
(prtIf by: acc) printString.
(prtIf by: ord) printString.
(accIf by: acc) deposit: 1000.
(mixIf by: acc) deposit: 1000.

Acccountは、printStringメッセージにも答えられる(Objectで定義されている)ので、問題なく実行されます。


MixInに適合したAccountインスタンスのインスペクト

最終的なソースコードです。
FileIn: Metamodel-Interface2.st (<=Click)

わずか2kにも満たないコードを追加しただけで、Smalltalkの世界の変更ができてしまうメタモデルの強力さ、味わっていただけたでしょうか。

本格的なInterfaceとしてはまだまだ改良の余地があります。例えば定義されたInterfaceがクラスやメタクラスと同様にブラウザで見えるようにしたり、クラスに対して、サポートできるInterfaceを答えられるようにするなどが考えられます。余力がある人はぜひチャレンジしてみてください。

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

さて、今回は、多少高度な内容でした。初心者の方はオブジェクト指向の懐の深さが味わえれば十分です。次回は初心に返り、最近何かと話題の多いデザインパターンについて、MVCを題材にしつつ解説していきます。ご期待ください。


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

Prev.

Index

Next