Skip to content

Instantly share code, notes, and snippets.

@ceving
Created December 31, 2023 13:02
Show Gist options
  • Save ceving/e3adcde1c1885a0787ed54b04abaf57e to your computer and use it in GitHub Desktop.
Save ceving/e3adcde1c1885a0787ed54b04abaf57e to your computer and use it in GitHub Desktop.
Vererbung ist nicht schlecht

Vererbung ist nicht schlecht

Nur die schlampige Verwendung von Sprache ist schlecht.

Seit ein paar Jahren macht sich in der Programmierwelt das Mantra breit, Vererbung sei schlecht und solle besser nicht verwendet werden1. Ich halte das für eine unangemessene Vereinfachung der Problematik.

Das Mantra wird durch das Liskovsche Substitutionsprinzip2 modiviert. Das Prinzip besagt, dass Objekte eines Untertyps, der von einem Obertyp abgeleitete wurde, an allen Stellen verwendbar sein müssen, an denen Objekte des Obertyps verwendbar sind. Obertyp-Objekte müssen durch Untertyp-Objekte substituierbar sein. Dieses Prinzip wird auf Vererbung in Programmiersprachen angewendet, indem die Elternklasse mit einem Obertyp und eine Kindklasse mit einem Untertyp gleichgesetzt wird.

Der Grund dafür ist die naive Implementation von Vererbung in diversen Programmiersprachen, die zwei Eigenschaften hat.

  1. Es gehen alle Eigenschaften der Elternteil-Klasse auf die Kind-Klasse über.
  2. Kind-Klassen-Objekte sind zuweisungskompatibel zu Eltern-Klassen-Objekten.

Einer Vererbung auch nur eine dieser beiden Eigenschaften zuzumessen ist falsch! Das wird unmittelbar klar, wenn man sich die ursprüngliche Bedeutung des Wortes Vererbung vergegenwärtigt.

Bei einer Vererbung gehen nicht alle Eigenschaften eines Elternteils auf ein Kind über. Ein Kind hat nur die Hälfte des Erbgutes und nicht das ganze Ergut eines Elternteils. Etwas, das das gesamte Erbgut von etwas anderem hat, nennt man nicht Kind sondern Klon. Das was in der naiven Implemenation von Vererbung als "vererben" bezeichnet wird, ist also tatsächlich ein "klonen" mit gleichzeitigem "mutieren".

Außerdem ist es vermessen anzunehmen, ein Kind können eines seiner Elternteile in allen Belangen ersetzen. Sicherlich kann ein Kind beispielsweise an Stelle seiner Eltern morgens Brötchen holen. Aber es kann nicht an Stelle seiner Eltern seine Abwesenheit vom schulischen Unterreicht entschuldigen.

Das Ergebnis einer Vererbung ist also etwas, das nur einen Teil der Eigenschaften seiner Eltern beinhaltet und das seine Eltern auch nur teilweise ersetzen kann. Die über mehere Jahrzehnte anhaltende Problematik bezüglich der "Vererbung in Programmiersprachen" besteht also ursächlich darin, dass ein Vorgang als "Vererbung" bezeichnet wurde, der tatsächlich keine Vererbung ist. Die ganze Problematik ist somit lediglich ein Beispiel für die schlampige Verwendung von Sprache. Diese schlampige Verwendung von Sprache ist Schuld daran, dass eine ganze Generation von Programmieren in die Irre geführt wurde.

Wer also das nächste mal das Wort inherits in einem seiner Programme verwendet, sollte darüber nachdenken, ob es es nicht angemessen wäre, dieses Vorkommen mit dem folgenden Kommentar zu garnieren: "Verflucht sei der Hund, der nicht sprechen kann!"

References

  1. Komposition an Stelle von Vererbung
  2. Liskovsche Substitutionsprinzip
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment