サブクラスではスーパークラスのメソッドを再定義することによっ て,インスタンスの挙動を変更することができる.例えば,以下の ような例を考えてみよう.
ruby> class Human ruby| def print_id ruby| print "I'm a man-kind.\n" ruby| end ruby| def train_toll(age) ruby| print "割引料金でOKです.\n" if age < 12 ruby| end ruby| end nil ruby> Human.new.print_id I'm a man-kind. nil ruby> class Student1<Human ruby| def print_id ruby| print "I'm a student.\n" ruby| end ruby| end nil ruby> Student1.new.print_id I'm a student. nil
print_idメソッドは再定義されているので,Student0での定義が呼 ばれている.しかし,メソッドを再定義する時に,再定義する前の メソッドを利用したい時がある.このような場合に使うのが, `super'だ.`super'が呼ばれると,再定義前のメソッドが呼ばれる.
ruby> class Student2<Human ruby| def print_id ruby| super ruby| print "I'm a student too.\n" ruby| end ruby| end nil ruby> Student2.new.print_id I'm a man-kind. I'm a studnet too. nil
`super'で呼び出された元のメソッドにはこのメソッドへの引数が そのまま引き渡される.もし,`super'に引数を渡せば,もとのメ ソッドがその引数で呼び出されることになる.
ruby> class Student3<Human ruby| def train_toll(age) ruby| super(11) # 無条件で割引 ruby| end ruby| end nil ruby> Student3.new.train_toll(25) 割引料金でOKです. nil
うーん,あまり良い例ではないが,感じはつかめたろうか.