next up previous contents
Next: 16 2010年度中間試験について(重要) Up: algorism_out Previous: 14 クラスの取り込み方法

15 クラスの継承

クラスをそのまま引き継いで、新しいメソッドを追加したい場合がある。 読み込むクラス名を ``First''、作成したクラス名を ``Second''とすると、
First < Second
とする。 もう一度、前節のプログラムを以下に表示する。
---------------------------- Program Start ----------------------------
require 'ennClass'   # 先ほどのプログラムを読み込んでいる。

class Taiseki
 def enchu(r,h)      # 円柱の体積を求めるためのメソッド定義
   a = Enn.new         # 読み込んだプログラムの "Enn" クラスのインスタンスを  
                       # 生成している。
   b = a.menseki(r)
   v = b * h
   return v   

 end
end

if $0 == __FILE__    # 今回も付け加えるとよい。
a = Taiseki.new
printf("円柱の体積は %f です。\n", a.enchu(2,5))
end
---------------------------- Program Start ----------------------------

ここで ``ennClass''のクラス ``Enn''を読み込んだあと、クラスの継承を 行う形式に変更する。 新しいクラスを「子クラス」または「サブクラス」、読み込む元になるクラスを 「親クラス」または「スーパークラス」などという。 すなわちファイルを ``require''し、
$「子クラス」 < 「親クラス」$
と言う形にする。 これにより、クラスの内容が新しいクラスに全て継承される(取り込まれる)こと となる。

---------------------------- Program Start ----------------------------
require 'ennClass'   # プログラムを読み込んでいる

class Taiseki < Enn  # クラスを継承して(取り込んで)いる 
 def enchu(r,h)      # 円柱の体積を求めるためのメソッド定義
   b = menseki(r)    # 円の面積計算
   v = b * h
   return v   
 end
end

if $0 == __FILE__    # 今回も付け加えるとよい。
a = Taiseki.new
printf("円柱の体積は %f です。\n", a.enchu(2,5))
end
---------------------------- Program Start ----------------------------

クラスシートを目の前にしながら説明する。 また、二つのプログラムを良く見比べて頂きたい。 新しいプログラムでは、クラス ``Enn''のメソッドがそのままクラス ``Taiseki''に 継承されている。したがって、メソッド ``enchu(r,h)'' 中で、円の面積計算の ために、新しいインスタンスの生成をする必要がない。 すなわち「親クラス」のメソッドは、そのまま「子クラス」で使うことができる。 したがって、円の面積の計算は

旧プログラムのとき
   a = Enn.new   
   b = a.menseki(r)

となっているが、新しいプログラムでは
   b = menseki(r)
となっている。

捕捉:「子クラス」と「親クラス」に同じメソッド名がある場合、そのメソッド を指定すると、「子クラス」のメソッドが優先(上書き)される。 「クラスのオーバーライド(override)」と言う。




平成22年12月28日