Ruby 使用手冊

重新定義方法

在子類別中,我們重新定義父類別方法,就能改變實例的行為。

ruby> class Human
    |   def identify
    |     puts "I'm a person."
    |   end
    |   def train_toll(age)
    |     if age < 12
    |       puts "Reduced fare.";
    |     else
    |       puts "Normal fare.";
    |     end
    |   end
    | end
   nil
ruby> Human.new.identify
I'm a person.
   nil
ruby> class Student1<Human
    |   def identify
    |     puts "I'm a student."
    |   end
    | end
   nil
ruby> Student1.new.identify
I'm a student.
   nil

如果我們要增強父類別的 identify 方法,而不是完全替換掉, 我們就會使用 super(編註: super 讓我們可以呼叫到父類別的同名函式,即 identify)。

ruby> class Student2<Human
    |   def identify
    |     super
    |     puts "I'm a student too."
    |   end
    | end
   nil
ruby> Student2.new.identify
I'm a person.
I'm a student too.
   nil

super 能夠把引數傳至原本的方法中。有時候會說,人有兩種⋯⋯

ruby> class Dishonest<Human
    |   def train_toll(age)
    |     super(11) # 我們想要便宜的價格。
    |   end
    | end
   nil
ruby> Dishonest.new.train_toll(25)
Reduced fare.
   nil

ruby> class Honest<Human
    |   def train_toll(age)
    |     super(age) # 傳進我們提供的參數
    |   end
    | end
   nil
ruby> Honest.new.train_toll(25)
Normal fare.
   nil

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."