![]() |
[1999 年 2 月号] |
[Happy Squeaking!!]
2.Squeak演習:クラスの継承関係作成
2.3 Employeeクラスの作成
次にHumanのサブクラスとしてEmployeeクラスを作成します。
同様にシステムブラウザを使ってクラス作成用のテンプレートを書き換え、"accept"します。
Human subclass: #Employee instanceVariableNames: 'id employedDate ' classVariableNames: '' poolDictionaries: '' category: 'CompanyApplication'
特に一行目の先頭に注意してください。今まではObjectでしたが、今回は、Humanになります。これはHumanのサブクラスとして、Employeeを指定するということを意味します。
Objectは継承のツリーのルートとなっている一番上位にあるクラスです。通常Smalltalkでは、どのクラスも継承しないということはなく、最低でもルートであるObjectから継承することになります。 |
SmallTip: Smalltalkでは、継承ツリーのルートはObjectである |
まだ操作を追加していないですが、とりあえずこの状態で、ワークスペース上でEmployeeのインスタンスを生成して観察してみましょう。
"従業員 山田さんの作成、観察" | yamada | yamada := Employee new. yamada inspect
以下のようなインスペクタが立ち上がります。
Employeeインスタンス(山田さん)のインスペクト
インスペクタの左側に注目してください。Employeeクラスの属性としては記述されていないnameフィールドがあることが確認できます。これはEmployeeクラスのスーパークラスであるHumanの属性であるnameの定義を引き継いだことを意味しています。
属性だけでなく操作も同様に継承されています。今度は従業員 鈴木さんのインスタンスを作成し、setName: メッセージを送ってみましょう。
"鈴木さんインスタンスの作成、名前付け、観察" | suzuki | suzuki := Employee new. suzuki setName: 'Suzuki'. suzuki inspect
以下のようなインスペクタが立ち上がります。
Employeeインスタンス(鈴木さん)のインスペクト
Employeeクラス自体では、setName: のメッセージに該当する操作が定義されていないのですが、そのスーパークラスでsetName: 操作の定義がされているため、問題なくname変数に値が設定されることになります。
それでは次にEmployeeクラスに対し、giveNameCardの操作を追加することにしましょう。
Employeeクラスに"actions"というメッセージカテゴリを追加します。
giveNameCardの実装は以下のようになります。
giveNameCard Transcript cr; show: 'giving ' , name, ' card'.
Transcriptに送っているcrは改行させるためのメッセージです。
giveNameCardのメソッド本体で、name変数を参照しています。これは、スーパークラスで属性として定義されているために問題なく使えることになります。
| suzuki | suzuki := Employee new. suzuki setName: 'Suzuki'. suzuki giveNameCard. suzuki inspect
Transcriptを開いてから実行してみてください。以下のように表示されます。
Employeeインタンスに giveNameCardメッセージを送る
インペクタのnameの値は、やはり'Suzuki'になっています。
© 1999-2001 OGIS-RI Co., Ltd. |
|