第2回 クラスの詳細(4月16日; 17日)

今日の課題

■ クラスの定義

ブラウザ (System Browser) を開く

「ワールド」(Ctrl + 右クリック)→「デスクトップメニュー」→「開く」→「ブラウザ」を選択

薄い緑色のウインドウがブラウザである。このウインドウは、5つの枠(ペインと呼ばれる)で構成されている。上段の左端のペインから順に、「カテゴリ」、「クラス」、「プロトコル」、「メソッド」をそれぞれ表示する。下段のペインで、選択した項目を編集する。

手順

カテゴリを作成

  1. 「カテゴリ」のペインで、「Ctrl + 左クリック」によりメニューを表示
  2. 「add item...」を選択
  3. カテゴリ名を入力する。本演習では、「MyObjects」と入力

クラスを作成

  1. 「カテゴリ」のペインで、カテゴリ名(MyObjects)を左クリック
  2. 下段のペインで「Object subclass: #NameOfSubclass」とあるところで、「NameOfSubclass」を、作成するクラス名に書き換え
  3. 「Ctrl + 左クリック」によりメニューを表示し、「了解 (s)」を選択

※ 「了解」のショートカットーキーは、「ALT + s」

インスタンス変数を定義

  1. 下段のペインで「instanceVariableNames: ''」とあるところで、シングルコーテーションの中に、変数名を列挙(複数の変数名を列挙する際、スペースを入れる)
  2. 「了解」する

メソッドを定義

  1. 「プロトコル」のペインで、「--all--」を左クリック
  2. 下段のペインで、メッソドを記入
  3. 「了解」する

※ 初めて定義するとき、イニシャルが問われる。簡単に自分のイニシャルを入れておこう。

練習1

ブラウザで、人(Person)のクラスを定義しよう。このクラスは、次の仕様とする:

ワークスペースで、以下の動作を確認しよう。
a := Person new    (ALT + d)
a inspect          (ALT + d) インスペクトのウインドウが表示される。「name」を左クリックしておこう。
a setName: 'taro'  (ALT + d)
a introduce        (ALT + p) 'My name is taro .'と表示される。

答えはココ ⇒

■ 継承

新しいクラスが、既存のクラスのインスタンス変数とメソッドの定義を引き継ぐことを、継承という。

用語:

「上位クラス」=「スーパークラス」:「継承されるクラス」
「下位クラス」=「サブクラス」:「継承するクラス」

継承するクラスの定義方法:

クラスを定義するペインにて、「上位クラス名 subclass: #下位クラス名」と記述する。

具体例

継承の御利益(その1)

下記のクラス定義を見てみよう。
Object subclass: #Person
    instanceVariableNames: 'name'
    - - - 省略 - - -

「Object」は既存のクラスであり、「Person」は新しいクラスである。

「Person」のクラスに、メソッド「inspectnew」を定義していない。しかし、先の練習1ではそれを使うことができた。これは「Object」クラスから「inspectnew」メソッドを継承しているからである。

継承の御利益(その2)

自分で作ったクラス(Person)を継承して、新しいクラス(Student)を定義してみよう。
Person subclass: #Student
    instanceVariableNames: ''
    - - - 省略 - - -

ワークスペースで、「a := Student new」とし、「a inspect」としてみよう。すると、インスタンス変数 name を定義していないのに、name が存在する。

練習2

上記の具体例を試してみよう。

(1) 人(Person)クラスを継承して、学生(Student)のクラスを定義しよう。

(2) ワークスペースで、変数 a が、学生クラスのインスタンスを指すように実行しよう。

(3) インスペクトで、変数 a のインスタンス変数を確認しよう。

□ メソッドのオーバーライド

上位クラスで定義されているメソッドと同名のメソッドを、下位クラスで定義することができる。このことを「メソッドのオーバーライド」という。同名のメソッドであるので、上位と下位の両方のクラスのメソッドは、類似した機能とすることが多い。

上位クラスのメソッドと同じ処理を、下位クラスのメソッドで定義することは、単に無駄というだけではなく、ソースコードの分散化になり保守の面で不具合が生じる。

そこで、下位クラスのメソッドから、上位クラスのメソッドを呼び出す仕掛けが存在する。それは、「super メッセージ」である。

練習3

練習2の続きとする。学生(Student)クラスの定義において、次の追加をしよう。

さらに、自己紹介のメソッド「introduce」を実行すると、'My name is 〔name〕 . My ID is 〔id〕 .' という文字列を返すことにしよう。このとき、「super」を使用せよ。

答えはココ ⇒

■ 小レポート

商品のクラス(Goods)を定義しよう。このクラスは以下の仕様を満たすものとする。インスタンス変数は必要に応じて使用して良い。

おまけ付き商品のクラス(GoodsPlus)を定義しよう。このクラスは以下の仕様を満たすものとする。インスタンス変数は必要に応じて使用して良い。

ワークスペースで、以下を実行しよう。
a := Goods new.
a setName: 'toy'.
a setBuyingPrice: 10.   おまけ商品の仕入れ値
a setSellingPrice: 30   (以上をまとめて、ALT+d)

a name                  (ALT+p)
a profit                (ALT+p)

b := GoodsPlus new.
b setName: 'choco'.
b setBuyingPrice: 20.   おまけ抜き商品の仕入れ値
b setSellingPrice: 60.  おまけ付き商品の仕入れ値
b setExtra: a           (以上をまとめて、ALT+d)

b name                  (ALT+p)
b extra name            (ALT+p)
b profit                (ALT+p) 60 - 20 - 10 = 30 を返り値としたい

提出の要領:

来週、演習の開始時に集めます。

画面の取り込みは、Linux の画面の左下の「メニュー」から「プログラム」→「グラフィック」→「スクリーンショット」を選択する。

■ 伝達事項

小レポートは、採点後に、いったん返却します。返却されたレポートは各自でファイルに綴じておいて下さい。最終レポートと同時にそのファイルを提出してもらいます。その後、ファイルは返却しませんので、必要ならば、最後の提出の前に、自分でコピーをとっておいて下さい。


(C) 2009.4.15 by tokuhisa