Kategorien
Objektorientierung Softwareentwicklung

Vererbung: Gut oder schlecht?

Vererbung: Gut oder schlecht?

Vererbung gilt als eines der Kennzeichen der Objektorientierung.
Die objektorientierte Programmierung war ein ziemlicher Hype, der in der Mitte der 1980er Jahre begann.
Die meisten Hochsprachen sind heutzutage objektorientiert: z.B. Java, C#, C++, Pascal.

Da die Vererbung ein zentrales Featues der Objektorientierung war, habe ich dieses Sprachfeature ausgiebig eingesetzt.
Na klar, hat ja nur Vorteile. Der größte Vorteil ist die Codewiederverwendung. Methoden und Membervariablen aus Basisklassen können in den abgeleiteten Klassen wiederverwendet werden:

  • Kein neu schreiben.
  • Kein Copy&Paste.
  • Einheitliche Namen von Methoden.

Wie gesagt, nur Vorteile. So dachte ich jedenfalls damals.

Dazugelernt

Mittlerweile bin ich schlauer – durch Literatur und durch eigene leidvolle Erfahrung.
Jetzt versuche ich Vererbung zu vermeiden und sie nur noch gezielt einzusetzen.
Warum Vererbung vermeiden?
Den o.g. Vorteilen steht ein großer Nachteil gegenüber: Die abgeleitete Klasse hat ihre Schnittstelle (= public Methoden) nicht unter Kontrolle.
Warum? – Sobald jemand in der Basisklasse eine zusätzliche public Methode hinzufügt, taucht diese auch in der Schnittstelle der abgeleiteten Klasse auf. Das gleiche Dilemma entsteht, wenn das Verhalten einer public Methode in der Basisklasse geändert wird. Das beeinflusst automatisch die abgeleitete Klasse.
Wir sprechen hier nicht von schlechter oder falscher Programmierung in der Basisklasse. Die beiden o.g. Fälle, in denen die Basisklasse geändert wird, können einen guten und richtigen Grund haben – für die Basisklasse. Das Problem ist, dass dies Auswirkungen auf die abgeleitete Klasse hat.

Die Lösung für das Problem ist die „Komposition“.
Verwende die Klasse nicht als Basisklasse, sondern als interne Membervariable. Dann profitiert man ebenfalls von Codewiederverwendung. Man hat zwar etwas mehr Arbeit, weil jeweils kurze Methoden erstellt werden müssen, die die Methoden der intern verwendeten Klasse aufrufen. Dafür hat die Klasse ihre Schnittstelle selber in der Hand und kann entscheiden, welche Methoden public sind.

Wann Vererbung einsetzen?
Vererbung kann eingesetzt werden, wenn es um Interface geht.
Während es in Sprachen wie Java und C# direkt das Sprachfeature des Interface gibt, muss man sich in C++ mit einer abstrakten Basisklasse als Interface behelfen. Diese abstrakte Basisklasse zeigt, warum Vererbung in diesem Fall ungefährlicher ist. Mit dem Interface wird keine Implementierung vererbt.

Braucht man trotz aller Bedenken doch eine Basisklasse, dann sollte folgendes bedacht sein: Eine Basisklasse muss als Basisklasse konzipiert sein:

  • Sie hat eine definierte Verantwortlichkeit.
  • Sie ist stabil, d.h. Änderungen und Erweiterungen sind zu vermeiden.

Zusammenfassung

  • Vererbung ist zu vermeiden.
    • Komposition statt Vererbung verwenden.
  • Vererbung im Falle von Interfaces ist Okay.
  • Eine Basisklasse muss als Basisklasse konzipiert sein.

Von Klaus Stein

Ich bin seit 20 Jahren in der Softwareentwicklung und in der Koordinatenmesstechnik tätig.
Da ich mich speziell um die Software für die Verzahnungsmesstechnik kümmere, ist das ebenfalls ein Themenschwerpunkt.