Ruby Users' Guide - 継承

前 - コピー - 次 - 目次

### 継承

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

これを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で書くのはちょっ と無理がある気もするが．

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

前 - コピー - 次 - 目次