ObjectSquare [1999 年 2 月号]

[Happy Squeaking!!]


2.Squeak演習:クラスの継承関係作成

2.6 selfの利用


ワークスペース上で再び以下のコードを実行してみてください。

| suzuki |
suzuki := Employee new.
suzuki setName: 'Suzuki'.
suzuki giveNameCard.

Transcriptでは、やはり以下のように表示されます。

EmployeeのgiveNameCardの実行結果

これを先ほどのgetNameの実行のように、名前の部分で 'Employee: 'という文字列が追加された形で表示されるようにするにはgiveNameCardメソッドにどのような変更を加えればよいでしょうか。

一つは以下のようにする方法があります。

giveNameCard
	Transcript cr; 
	 	    show:  'giving ' , ('Employee: ', name), ' card'.

メソッドgetNamenの場合と全く同じように'Employee: ', name と書き換えました。
これでも期待する結果は得られますが、全く同じコードが二個所に分散しているのは保守上いかにも関心できません。

では、giveNameCardメソッドの中で、先ほど定義しなおしたgetNameメソッドが起動できるとしたらどうでしょうか。

つまり、

giveNameCard
	Transcript cr; 
	 	    show:  'giving ' , (## getNameの呼び出し ##) , ' card'.

のように記述できれば、(## getNameの呼び出し ##) 部分が実行され、その結果 'Employee: 'が追加された文字列が返ってきて、うまくいくはずです。

実はSmalltalkでは、自分のクラス内で定義されたメソッドを起動するときに、以下のように書くことができます。

giveNameCard
	Transcript cr; 
	 	    show:  'giving ' , ( self getName ) , ' card'.

メソッドの起動を行うには、通常、なんらかのオブジェクトに対してメッセージを送らなければなりません。しかし上の場合は、getNameメッセージの受け手は自分自身に他なりません。getName操作を定義しているのは自分のクラスなのですから。

このように外部からではなく内部的にメソッドを起動したい場合には、自分自身を表すオブジェクトが必要になります。これがselfなのです。

SmallTip: 自身を表すための特別なオブジェクトとしてselfがある
C++や、Javaでは、selfではなくthisというキーワードを使いますが、同じ物を表しています。

self オブジェクトを使ってメソッドを書きなおし再度実行してみましょう。結果は当然ながら、

giving Employee: Suzuki card

となります。


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

Prev.

Index

Next