Checkmark on Circle.png

Vererbung (Informatik)

Aus KGS-Wiki

Ein UML-Klassendiagramm mit Vererbungsbeziehungen

Vererbung ist ein Konzept aus der objektorientierten Programmierung. Eine Klasse kann von einer anderen Klasse Methoden und Attribute erben und damit deren Funktion erweitern. Die erbende Klasse wird dabei auch als Unterklasse, Kindklasse oder abgeleitete Klasse bezeichnet, die vererbende Klasse als Oberklasse, Elternklasse oder Basisklasse.

Sprachlich können Vererbungsbeziehungen als "Jedes X ist ein Y" ausgedrückt werden: Jeder Hund ist ein Tier, jedes Cabrio ist ein Auto, jedes Quadrat ist ein Rechteck, jede Kirche ist ein Gebäude. Das bedeutet auch, dass jedes Cabrio auch alles das tun kann, was alle Autos können, aber auch eigene Funktionalitäten wie das Öffnen des Verdecks haben kann. Ebenso hat eine Kirche alle Eigenschaften eines Gebäudes wie Grundfläche, Höhe und Baujahr, aber auch noch einige mehr wie die Zugehörigkeit zu einer Gemeinde[1].

Der Zwek von Vererbung ist es, Redundanzen im Code zu vermeiden, indem Attribute und Methoden aus überall gleichen Unterklassen in eine gemeinsame Oberklasse verschoben werden. Auf diese Weise müssen Änderungen nur an einer Stelle angebracht werden statt in allen Klassen.

In Java

In Java wird das Schlüsselwort extends in der Klassendefinition verwendet, um eine Vererbung zu deklarieren:

public class Auto {
    public void fahren() {
        // ...
    }
}

public class Cabrio extends Auto {
    // Cabrio ist nun eine Unterklasse von Auto
    // und verfügt auch über die Methode fahren.
}

Die Idee dahinter: die Kindklasse erweitert (engl. extends) das Methodenrepertoire der Elternklasse.

In Python

In Python wird in der Klassendefinition der Name der Elternklasse in Klammern hinter den Namen der neu definierten Klasse geschrieben:

class Auto:
    def fahren:
        pass

class Cabrio(Auto):
    pass
    # Cabrio ist jetzt eine Unterklasse von Auto
    # und verfügt auch über die Methode fahren.

Mehrfachvererbung

Mehrfachvererbung: Bat erbt von Mammal und von WingedAnimal

Mehrfachvererbung heißt, dass eine Klasse von zwei Elternklassen erbt. Dies kann problemlos ablaufen, wie in dem abgebildeten Beispiel: der Aufruf Bat.flap() ruft WingedAnimal.flap() auf, Bat.breathe() ruft Mammal.breathe() auf und Bat.eat() ruft Animal.eat() auf.

Problematisch kann dies aber werden, wenn eine Methode desselben Namens in mehreren Elternklassen definiert ist. Nehmen wir an, in Mammal gäbe es eine Methode getSize(), die die Kopf-Rumpf-Länge eines Säugetieres zurückgibt, und in WingedAnimal gäbe es eine Methode getSize(), die die Flügelspannweite eines geflügelten Tieres als Größe zurückgibt. Welches Ergebnis soll Bat.getSize() nun liefern?

In Java ist Mehrfachvererbung aus diesem Grund nicht erlaubt. In Python ist Mehrfachvererbung zugelassen, aber kompliziert zu verstehen[2] und kann in einigen Fällen, wenn die Reihenfolge der Oberklassen nicht eindeutig aufgelöst werden kann, zu einer Fehlermeldung führen.

Fußnoten

  1. Der Autor hat zeit seines Lebens nie ein Auto besessen, ist konfessionslos und bittet, alle Fehler und Ungenauigkeiten in diesem Satz zu entschuldigen.
  2. http://python-history.blogspot.com/2010/06/method-resolution-order.html