第3回(10/16) ポリモーフィズム ・イテレータ、クラスメソッド、クラス変数 ・オブジェクトの格納とメソッド呼出し ☆ 図形クラス、ドキュメントのクラス ■ イテレータ ・配列変数の各要素を表示するとき、どうするか? - 配列変数の引数を使う ⇒ list0301.rb - イテレータを使う ⇒ list0302.rb ・配列変数の各要素を計算してみよう ⇒ list0303.rb □□□ 演習1 □□□ 三角形クラス Triangle を宣言せよ。初期化メソッド initialize は、引数として、底辺の長さ、および、高さを与える。面積計算メソッド menseki は、三角形の面積を返す。 メインルーチンでは、次のようにして三角形インスタンスを作る。 objs = Array.new objs << Triangle.new(2,3) objs << Triangle.new(2,4) objs << Triangle.new(3,6) この後、イテレータを使って、それぞれについて面積を計算し表示せよ。 出力例: 3.0 4.0 9.0 ⇒ prac0301.rb ■ ポリモーフィズム ・多態性、多相性 ・オブジェクトが独自のメッセージの解釈を持つこと ・共通の意味・機能には、共通のメソッド名を与える。 例:「/」は割り算の意味。 整数クラスのときは「小数点以下切捨て、で割り算する」 浮動小数点クラスのときは「小数点以下も求める」 ● 配列変数の型宣言が無いこと。 ⇒ list0304.rb をよく見ると、 配列変数 a は、C言語でいう、int 型と float 型が混在している。 int a[8]; それとも float a[8]; ? 実行結果: 1 1 2 2 1.0 1.5 2.0 2.5 整数クラスは、整数値の割り算、浮動小数点クラスは、小数値の割り算をしている。 = クラスごとに割り算の解釈が異なる。 □□□ 演習2 □□□ 図形クラスとして、長方形クラス Rectangle, 円クラス Circle を追加せよ。初期化メソッドでは、底辺の長さと高さ、半径をそれぞれ与える。そして、面積を返すメソッド menseki を作成せよ。メインルーチンでは、配列変数にそれぞれのインスタンスを格納し、各面積を表示せよ。 メインルーチンの例: objs = Array.new objs << Triangle.new(3,4) objs << Rectangle.new(2,5) objs << Triangle.new(4,4) objs << Circle.new(2) objs << Triangle.new(6,4) 以下、面積の計算と表示 ⇒ prac0302.rb ● サブルーチンの引数に型宣言が無いこと。 サブルーチン arg_hello_world! は、第一引数の s に、「Hello」、第二引数のname、「World!」を格納する機能がある。文字列クラス、配列クラス、出力クラス、には、演算子「<<」があるので、第一引数のクラスに応じて、格納の仕方が自動的に決まる。 ⇒ list0305.rb ○ クラスメソッド ・インスタンスを作らなくても使えるメソッド ・Class宣言の方法 def クラス名.メソッド名 - - - プログラムを書く - - - end ・メインルーチンなどでの呼出し方 クラス::メソッド名 【比較】インスタンスメソッドのとき、 ・Class 宣言の方法 def メソッド名 - - - プログラムを書く - - - end ・メインルーチンなどでの呼出し方 変数 x = クラス名.new まず、インスタンスを作る。 変数 x.メソッド名 ⇒ list0306.rb □□□ 演習3 □□□ Latexクラス、Htmlクラス、Emailクラスの3クラスのそれぞれについて、タイトル、日付、差出人、を標準出力に出力するクラスメソッド print_header を作れ。 たとえば、メインルーチンで、 Latex::print_header('演習レポート','2002.10.16','鳥大太郎') と実行すると、 \begin{center} {\LARGE 演習レポート}\\ 2002.10.16\\ {\large 鳥大太郎} \end{center} と出力する。 同様の呼び出しで、Htmlクラスの場合、つまり Html::print_header('演習レポート','2002.10.16','鳥大太郎') と実行すると、
演習レポート
2002.10.16
鳥大太郎
カップ麺の作り方
2002.10.16
鳥大太郎