![]() |
[1999 年 2 月号] |
[Happy Squeaking!!]
2.Squeak演習:クラスの継承関係作成
2.5 getNameメソッドのオーバーライド
それでは次に、Employeeクラスに、Humanクラスで定義されているのと同じ操作である、getNameを再定義することにします。
階層ブラウザで、Employeeを選択し、メッセージカテゴリ 'accessing'を追加します。
getNameの実装は、以下のように、スーパークラスEmployeeのgetNameの実装とは少し変えてみます。
先頭に 'Employee: 'と文字列が追加された形で文字列が返るようにします。
getName ^ 'Employee: ', name
'accept'してください。
これでオーバーライドができたことになります。
HumanクラスのgetNameをEmployeeクラスでオーバーライド
実際に振る舞いが、上書きされているかどうかを確かめるため、簡単なコードをワークスペース上で実行してみます。
| yamada suzuki | yamada := Human new. yamada setName: 'yamada'. suzuki := Employee new. suzuki setName: 'Suzuki'. Transcript cr; show: yamada getName. Transcript cr; show: suzuki getName.
山田さんはHumanのインスタンスですが、鈴木さんはEmployeeのインスタンスです。EmployeeクラスはHumanクラスを継承しているために、setName: の操作は共通の動作が行われます。一方で、getNameに関しては、Employeeクラスでメソッドの再定義(オーバーライド)を行ったので、鈴木さんは山田さんとは違う動作をすることになります。
Transcriptを開いたうえで実行してみてください。以下のような結果になります。
オーバーライドされたgetName操作の実行結果
各インスタンスがそれぞれの所属するクラスでのメソッドに従って動作しているのが確認できます。
© 1999-2001 OGIS-RI Co., Ltd. |
|