![]() |
[1999 年 2 月号] |
[Happy Squeaking!!]
6.Squeak 演習:ポリモルフィズムに親しむ
6.2 条件クラスの作成
次に真、偽の条件を表すために以下のようなクラスを定義します。
BooleanCondition (真偽条件 {抽象クラス}) TrueCondition (真 条件) FalseCondition (偽 条件)
BooleanConditionのconditionTrue:conditionFalse:メソッド (actionsカテゴリ) conditionTrue: oneAction conditionFalse: theOtherAction self subclassResponsibility
TrueConditionのconditionTrue:conditionFalse:メソッド (actionsカテゴリ) conditionTrue: oneAction conditionFalse: theOtherAction oneAction fire
FalseConditionのconditionTrue:conditionFalse:メソッド (actionsカテゴリ) conditionTrue: oneAction conditionFalse: theOtherAction theOtherAction fire
真の条件(TrueCondition)の場合は、conditionTrue:conditionFalse:メソッドの、conditionTrue:
側の引数として与えられたoneActionオブジェクト(TranscritpActionのサブクラスのインスタンス)に対してfireメッセージを送っています。
偽の条件(FalseCondition)の場合は、逆にconditionFalse:の引数として与えられたtheOtherActionオブジェクトに対し、fireメッセージが送られることになります。
FileIn: IfLess-Condition.st (<= Click)
最後に条件を擬似的に生み出すためのテスト用のクラスを作成します。
BooleanConditionMakerというクラスを作成します。
BooleanConditionMakerのrandomConditionメソッド (actionsカテゴリ) randomCondition 10 atRandom < 5 ifTrue: [Transcript cr; show: 'TRUE'. ^ TrueCondition new] ifFalse: [Transcript cr; show: 'FALSE'. ^ FalseCondition new]
randomConditionメソッドの内部では、1から10までの乱数を発生させ、場合に応じてTrueConditionやFalseConditionを返すようにしています。
(この中ではやむをえず本当のif文を使っています)
FileIn: IfLess-Test.st (<= Click)
整数オブジェクト にatRandomメッセージを送ると乱数を得ることができますが、これはSqueakに用意されている独自のAPIといえます。標準的なSmalltalkの書き方では、Random new nextで乱数を得ることになります。(Squeakでもこの方法が使えますが、単純化のためにatRandomの方を使っています)。 |
これで全ての準備が整いました。ワークスペースで実行してみましょう。
Smalltalk組み込みのifTrue:ifFalse:文(もどき)のように見えますでしょうか。
| condition | condition := BooleanConditionMaker new randomCondition. condition conditionTrue: ( ShowHelloWorldAction new) conditionFalse: ( ShowByeAction new).
この場合、条件側も、アクション側も、両方ポリモルフィズムを使うことになります。流れを説明しましょう。
BooleanConditionMakerは乱数によってTrueConditionか、FalseConditionのいずれかのインスタンスを作ります。
変数conditionにはそのインスタンスが入り、それに対してconditionTrue:conditionFalse:のメッセージが投げらます。
ここでまず条件側(BooleanConditionのサブクラス群)でポリモルフィズムを使うことになります。
つまりBooleanConditionのサブクラスは、それぞれのやり方でconditionTrue:conditionFalse:を処理します。(
TrueConditionならばconditionTrue:側の引数として入ってきたオブジェクトにfireを送る。FalseConditionならばその逆)。
引数には、TranscriptActionのサブクラスのインスタンスが入っており、fireが送られたときに("HelloWorld"や"Bye"とTranscriptに表示するなど)それぞれの振る舞いをすることになります。ここで、アクション側でポリモルフィズムが使われています。
何度か"do it"してみてください。
条件に応じて異なるアクションが実行されることが確認できます。
if-lessプログラミングの実行結果
© 1999-2001 OGIS-RI Co., Ltd. |
|