Previous
Prev
Contents
Contents
Next
Next
 Ruby user's guide Redefinition of methods  

In a subclass, we can change the behavior of the instances by redefining superclass methods.

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

Suppose we would rather enhance the superclass's identify method than entirely replace it.  For this we can use super.

 ruby> class Student2<Human
     |   def identify
     |     super
     |     print "I'm a student too.\n"
     |   end
     | end
    nil
 ruby> Student2.new.identify
 I'm a human.
 I'm a student too.
    nil

super lets us pass arguments to the original method.  It is sometimes said that there are two kinds of people...

 ruby> class Dishonest<Human
     |   def train_toll(age)
     |     super(11) # we want a cheap fare.
     |   end
     | end
    nil
 ruby> Dishonest.new.train_toll(25)
 Reduced fare. 
    nil
 ruby> class Honest<Human
     |   def train_toll(age)
     |     super(age) # pass the argument we were given
     |   end
     | end
    nil
 ruby> Honest.new.train_toll(25)
 Normal fare. 
    nil

Previous
Prev
Contents
Contents
Next
Next