Наша классаификация объектов в повседеневной жизни естественно иерархична. Мы знаем, что все кошки есть млекопитающие, и все млекопитающие есть животные. Более мелкие классы наследуют характеристики более крупых, к которым они принадлежат.
Мы можем отразить эту концепцию в 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 должен дышать (breathe), каждый кот наследует поведение класса Mammal, поскольку Cat был определен как подкласс Mammal. (В ОО терминологии меньший класс является подклассом а больший (более общий) класс является суперклассом.) Следовательно, с точки зрения программиста, кошки (cats) бесплатно получают возможность дышать (breathe); после добавления метода speak method, наши кошки могут и дышать (breathe) и говорить (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
Вместо того, чтобы полностью определять все свойства каждого новото класса, мы можем просто добавить или переопределить их в соответствии с различиями между подклассом и суперклассом. Это использование наследования иногда называют differential programming. Это одно из преимуществ объектно-ориентированного программирования.
Источник: www.opennet.ru
К началу статьи