モノの分類は階層的な場合が多い.例えば,「猫」は「ホ乳類」で あり,「ホ乳類」は「動物」である.ある分類は上の分類の性質を 受け継ぐ.これを継承と呼ぶ.例えば,「動物」が呼吸するので, 当然「猫」も呼吸する.
これをrubyで表現すると,
ruby> class Animal ruby| def breath ruby| print "息を吸って,吐く\n" ruby| end ruby| end nil
ruby> class Cat<Animal ruby| def bark ruby| print "にゃ〜\n" ruby| end ruby| end nil
となる.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 nil
ruby> class Penguin<Bird ruby| def fly ruby| fail "Penguins can't fly" ruby| end ruby| end nil
こんな感じだ.こういう知識表現のようなことをrubyで書くのはちょっ と無理がある気もするが.
継承を使えば,共通の性質はスーパークラスで定義すれば,サブク ラスでは『違い』だけを,追加したり,再定義したりすれば良い. このことを「差分プログラミング」と呼ぶ人もいる.オブジェクト 指向プログラミングの嬉しい点のひとつだ.