Ruby 使用手冊

繼承 Inheritance

日常生活中的物件類別都會分有階層, 我們知道所有貓都是哺乳類所有哺乳類都是動物。較小的類別會繼承 (inherit) 具有所屬較大類別的特徵。如果所有哺乳類都會呼吸,那麼所有貓也會呼吸。

我們可以在 Ruby 表達這種概念:

ruby> class Mammal
    |   def breathe
    |     puts "inhale and exhale"
    |   end
    | end
   nil
ruby> class Cat < Mammal
    |   def speak
    |     puts "Meow"
    |   end
    | end
   nil

雖然我們沒有指定 Cat 應該呼吸,但因為 Cat 被定義為 Mammal 的子類別,所以就會繼承 Mammal 類別的行為。(物件導向程式語言的術語中,較小的類別稱為子類別 (subclass),較大的類別稱為父類別 (superclass)。)從程式員的角度看來,貓很自然就會呼吸,我們再加入 speak (講話)的方法後,我們的貓就會呼吸講話。

ruby> tama = Cat.new
   #<Cat:0xbd80e8>
ruby> tama.breathe
inhale and exhale
   nil
ruby> tama.speak
Meow
   nil

有時,特定子類別不應繼承父類別的某些特性。例如,鳥類一般都會飛,但企鵝就是不會飛的鳥。

ruby> class Bird
    |   def preen
    |     puts "I am cleaning my feathers."
    |   end
    |   def fly
    |     puts "I am flying."
    |   end
    | end
   nil
ruby> class Penguin < Bird
    |   def fly
    |     fail "Sorry.I'd rather swim."
    |   end
    | end
   nil

我們不需要徹底地為每個新類別定義每個特徵,只要加入或重新定義子類別與父類別的差異即可 (編註:我們在 Penguin 裡覆寫掉 fly 這個方法)。繼承有時候也稱為差分程式設計 (differential programming), 這也是物件導向程式設計的其中一項優點。

Copyright (c) 2005-2008 Mark Slagell,中文翻譯 Ruby Taiwan 社群

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.

A copy of the license is included in the section entitled "GNU Free Documentation License."