第5回 Smalltalk の総合練習(5月15日)

■ 課題

アイスクリームの商品を扱うオブジェクトを作ろう。

まず、商品のクラス Goods を次のように設計する。インスタンス変数と して、price(単価)を持つ。そのアクセサとして、setPrice:(単価を代入す る)と howMuch(単価を返す)を持つ。クラスメソッドとして、 producePrice:(指定単価で製品を作る)を持つ。これは、引数の単価の値を インスタンス変数に持つインスタンス(オブジェクト)を返す。たとえば、 「g := Goods producePrice: 100」とすると、Goods のインスタンスを変数 g に代入する。これは、「g := Goods new. g setPrice: 100」と同じであるが、 本課題では、前者の方法で実行するものとする。

次にアイスクリームのクラスを次のように設計する。アイスクリームは、 抽象クラス IceCream とする。具体的な下位のクラスとして、「当りアイスク リーム (AtariIceCream)」と「外れアイスクリーム (HazureIceCream)」を設 ける。

IceCream は、Goods クラスを継承するものである。新たなインスタンス 変数として、taste(味)を持つ。そのアクセサとして、setTaste:(味を代入 する)と whatTaste(味を返す)を持つ。新たなクラスメソッドとして、 producePrice:Taste:(味を指定して製品を作る)を持つ。また、当り/外れを 判別する抽象メソッド drawLot を持つ。

AtariIceCream は、IceCream を継承するものであり、メソッド drawLot が true を返すものとする。HazureIceCream は、IceCream を継承するもので あり、メソッド drawLot が false を返すものとする。

一方、アイスクリームの商品を入れておく箱のクラス IceCase を次のよ うに設計する。IceCase は Goods クラスを継承するものである。新たなイン スタンス変数としては、iceCreams(アイスクリームを格納するコレクション) を持つ。これは、producePrice: の際に、初期化されるものとする。メソッド howMuch は、箱の値段と格納しているアイスクリームの値段の合計を返すこと にする。これらのメソッドは適宜オーバーライドしておくこと。また、次のメ ソッドは新たなメソッドである:

以上の設計のとおりにオブジェクトを作成しよう。必要に応じて、メソッ ドを新たに追加しても良い。参考のために、オブジェクト間の関係を下図に示 す。

レポートの報告事項として、workspace 上で少なくとも次の意味の動作を 実行して結果を示そう。必要に応じて、変数を使用して良い。

□ 今回の小レポートの作成要領

次の形式でレポートを作成せよ。

次回の演習の際(5/22)に集めます。


(C) 2008.5.12 by tokuhisa