Наша классификация объектов в каждом дне жизни является на самом деле иерархической. Мы знаем, что все кошки млекопитающие, а все млекопитающие являются животными. Наименьшие классы наследуют характеристики из больших классов, к которым они принадлежат. Если все млекопитающие дышат, то все кошки также дышат.
Мы можем выразить эту концепцию в Ruby:
- ruby> class Mammal
- | def breathe
- | print "inhale and exhale\n"
- | end
- | end
- nil
- ruby> class Cat<Mammal
- | def speak
- | print "Meow\n"
- | end
- | end
- nil
Хотя мы не указываем, как Cat должен дышать, каждая кошка будет наследовать это поведение от класса Mammal, с тех самых пор, как Cat был определён подклассом Mammal. (В объектно-оринтированной терминологии меньший класс является подклассом большего класса, являющегося суперклассом) С точки зрения программиста, кошки получают способность дышать бесплатно, а после того, как мы добавим метод speak, то наши кошки смогут дышать и говорить одновременно.
- ruby> tama = Cat.new
- #<Cat:0xbd80e8>
- ruby> tama.breathe
- inhale and exhale
- nil
- ruby> tama.speak
- Meow
- nil
Могут быть ситуации, где некоторые свойства суперклассов не должны наследоваться определённым подклассом. Хотя птицы, как правило, знают как летать, но пингвины являются нелетающим подклассом птиц
- ruby> class Bird
- | def preen
- | print "I am cleaning my feathers."
- | end
- | def fly
- | print "I am flying."
- | end
- | end
- nil
- ruby> class Penguin<Bird
- | def fly
- | fail "Sorry. I'd rather swim."
- | end
- | end
- nil
Вместо того, чтобы определять все свойства каждого нового класса, мы должны только добавить или переопределить различия между подклассом и суперклассом. Такое использование наследования иногда называют дифференциальным программированием. Это одно из преимущество объектно-ориентированного программирования.