[ruby-list:190] TUTORIAL - inheritance

From: matz@... (Yukihiro Matsumoto)
Date: 1996-02-21 01:16:24 UTC
List: ruby-list #190
まつもと ゆきひろ@トヨタケーラムです.

今日のチュートリアルのお題は「継承」です.
--
継承

モノの分類は階層的な場合が多い.例えば,「猫」は「ホ乳類」で
あり,「ホ乳類」は「動物」である.ある分類は上の分類の性質を
受け継ぐ.これを継承と呼ぶ.例えば,「動物」が呼吸するので,
当然「猫」も呼吸する.

これをrubyで表現すると,

 ruby> class Animal
 ruby|   def breath
 ruby|     print "息を吸って,吐く\n"
 ruby|   end
 ruby| end
 Animal

 ruby> class Cat:Animal
 ruby|   def bark
 ruby|     print "にゃ〜\n"
 ruby|   end
 ruby| end
 Cat

となる.Catクラスでは呼吸について何も定義しなくても,Animal
クラスの定義をそのまま受け継ぐことになる.で,この場合,「鳴
く」能力が追加されているわけだ.barkで「鳴く」ってのも変だが,
この辺が英語力の限界だろう.

 ruby> tama = Cat.new
 #<Cat:0xbd80e8>
 ruby> tama.breath
 息を吸って,吐く
 nil
 ruby> tama.bark
 にゃ〜
 nil

ただし,いつも上のクラス(親クラスとかスーパークラスとか呼ぶ)
の性質をそのまま下の方(子クラスとかサブクラスと呼ぶ)で受け継
ぐわけではない.例えば,「鳥」は飛ぶが,「ペンギン」は飛ばな
い.つまり,「ペンギン」は「鳥」の「卵を産む」などのほとんど
の性質を継承するが,「飛ぶ」性質だけは異なっている.これを再
定義と呼ぶ.

rubyで表現してみよう.

 ruby> class Bird
 ruby|   def lay_egg
 ruby|     # do something ..
 ruby|   end
 ruby|   def fly
 ruby|     #...
 ruby|   end
 ruby|   #...
 ruby| end
 Bird

 ruby> class Penguin:Bird
 ruby|   def fly
 ruby|     fail "Penguins can't fly"
 ruby|   end
 ruby| end
 Penguin

こんな感じだ.こういう知識表現のようなことをrubyで書くのはちょっ
と無理がある気もするが.

継承を使えば,共通の性質はスーパークラスで定義すれば,サブク
ラスでは『違い』だけを,追加したり,再定義したりすれば良い.
このことを「差分プログラミング」と呼ぶ人もいる.オブジェクト
指向プログラミングの嬉しい点のひとつだ.

In This Thread

Prev Next