ObjectSquare [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.

Prev.

Index

Next