[ruby-list:191] TUTORIAL - method redefinition

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

昨日話した,再定義の話の続きです.
--
メソッドの再定義

サブクラスではスーパークラスのメソッドを再定義することによっ
て,インスタンスの挙動を変更することができる.例えば,以下の
ような例を考えてみよう.

 ruby> class Human
 ruby|   def print_id
 ruby|     print "I'm a man-kind.\n"
 ruby|   end
 ruby|   def trail_toll(age)
 ruby|     print "割引料金でOKです.\n" if age < 12
 ruby|   end
 ruby| end
 Human
 ruby> Human.new.print_id
 I'm a man-kind.
 ruby> class Student1
 ruby|   def print_id
 ruby|     print "I'm a student.\n"
 ruby|   end
 ruby| end
 Student1
 ruby> Student1.new.print_id
 I'm a student.
 nil

print_idメソッドは再定義されているので,Student0での定義が呼
ばれている.しかし,メソッドを再定義する時に,再定義する前の
メソッドを利用したい時がある.このような場合に使うのが,
`super'だ.`super'が呼ばれると,再定義前のメソッドが呼ばれる.

 ruby> class Student2
 ruby|   def print_id
 ruby|     super
 ruby|     print "I'm a student too.\n"
 ruby|   end
 ruby| end
 Student2
 ruby> Student2.new.print_id
 I'm a man-kind.
 I'm a studnet too.
 nil

`super'で呼び出された元のメソッドにはこのメソッドへの引数が
そのまま引き渡される.もし,`super'に引数を渡せば,もとのメ
ソッドがその引数で呼び出されることになる.

 ruby> class Student3
 ruby|   def train_toll(age)
 ruby|     super(11) # 無条件で割引
 ruby|   end
 ruby| end
 Student3
 ruby> Student3.new.train_toll(25)
 割引料金でOKです. 
 nil

うーん,あまり良い例ではないが,感じはつかめたろうか.

In This Thread

Prev Next