![]() |
[1999 年 2 月号] |
[Happy Squeaking!!]
6.Squeak 演習:ポリモルフィズムに親しむ
6.1 If なしのプログラム
ポリモルフィズムをうまく使うことによって、クライアント側のコードからif文による条件分岐を全くなくしてしまうことができます。
その極端な例はif文自体をポリモルフィズムでシミュレートしてしまうことです。
以下に例を示してみましょう。
まず、条件があった場合に起動されるアクションを表現するために、以下のようなクラスを定義します。
TranscriptAction( トランスクリプト表示アクション {抽象クラス}) ShowHeloWorldAction ('HelloWorld'と表示するアクション) ShowByeAction ('Bye'と表示するアクション)
そしてそれぞれ
TranscriptActionのfireメソッド (actionsカテゴリ) fire "抽象メソッド、サブクラスが実装すべきなのでエラーを返す" self subclassResponsivility..
ShowHelloWorldActionのfireメソッド (actionsカテゴリ) fire Transcript cr; show: 'HelloWorld'
ShowHelloWorldActionのfireメソッド (actionsカテゴリ) fire Transcript cr; show: 'Bye'
のようにメソッドの実装を行ないます。
Smalltalkは、暗黙的なポリモルフィズムをサポートするので、この場合特にTranscriptActionクラスの定義は必要ありませんが、わかりやすさのためにあえて作成しています。
fireメソッドは、各サブクラスで適切に記述されるので、抽象クラスのレベルでは実装する必要がありません。宣言だけで実体のない、抽象メソッドとなります。この場合、fireメソッドの実装を何も書かない状態にしておいてもいいのですが、fireをサブクラスで適切にオーバーライドしてほしいということを示すために、self
subclassResponsivilityと記述しておいたほうが親切です。
なぜならself subclassResponsivilityと書かれたメソッドが起動されると、Squeakでは以下のようなノーティファイアが開くようになっているからです。
subclassResponsivilityメソッド起動によるノーティファイアの出現
仮にサブクラスでfireメソッドを定義し忘れたとすると、スーパークラスTranscriptActionでのfireメソッドが起動され、実行時に注意を促すことになります。
SmallTip: 抽象メソッドであることを示すには、メソッド本体に、self subclassResponsivilityと記述する |
とりあえずここまでのソースをFileInしましょう。
FileIn: IfLess-Action.st
(<=Click)
© 1999-2001 OGIS-RI Co., Ltd. |
|