В подклассе, мы можем изменить поведение экземпляров класс переопределив методы суперкласса.
- 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
Или, допустим, мы решили расширить метод identifity суперкласса вместо того, чтобы заменить его. Для этого мы можем использовать оператор 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 позволяет нам также передавать параметры в метод суперкласса. Это может быть полезно в том случае, если предварительно потребуется модифицировать или обработать полученные данные, а потом уже использовать обработку из метода суперкласса.
- 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