Наша классификация объектов в каждом дне жизни является на самом деле иерархической. Мы знаем, что все кошки млекопитающие, а все млекопитающие являются животными. Наименьшие классы наследуют характеристики из больших классов, к которым они принадлежат. Если все млекопитающие дышат, то все кошки также дышат.
Мы можем выразить эту концепцию в 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
Вместо того, чтобы определять все свойства каждого нового класса, мы должны только добавить или переопределить различия между подклассом и суперклассом. Такое использование наследования иногда называют дифференциальным программированием. Это одно из преимущество объектно-ориентированного программирования.