Unsere Klassifizierung von Objekten in jedem Lebenstag ist eigentlich hierarchisch. Wir wissen, dass alle Katzen Säugetiere sind und alle Säugetiere Tiere. Kleinste Klassen erben Merkmale von den größeren Klassen, zu denen sie gehören. Wenn alle Säugetiere atmen, atmen auch alle Katzen.
Wir können dieses Konzept in Ruby ausdrücken:
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
Obwohl wir nicht spezifizieren, wie * Katze * atmen soll, erbt jede Katze dieses Verhalten von * Säugetier, * seit * Katze * eine Unterklasse * Säugetier * wurde (in der OO-Terminologie ist die kleinere Klasse eine Unterklasse einer größeren Klasse, was eine Superklasse ist) Aus der Sicht eines Programmierers erhalten Katzen die Möglichkeit, kostenlos zu atmen, und nachdem wir eine * Sprechmethode hinzugefügt haben, * können unsere Katzen gleichzeitig atmen und sprechen.
ruby> tama = Cat.new #<Cat:0xbd80e8> ruby> tama.breathe inhale and exhale nil ruby> tama.speak Meow nil
Es kann Situationen geben, in denen bestimmte Eigenschaften von Oberklassen nicht von einer bestimmten Unterklasse geerbt werden sollen. Obwohl Vögel im Allgemeinen fliegen können, sind Pinguine eine flugunfähige Unterklasse der Vögel.
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
Anstatt alle Eigenschaften jeder neuen Klasse zu definieren, müssen wir nur die Unterschiede zwischen Unterklasse und Oberklasse hinzufügen oder neu definieren. Diese Verwendung der Vererbung wird manchmal als differenzielle Programmierung bezeichnet. Dies ist einer der Vorteile der objektorientierten Programmierung.