Avatar von Schmarotzer
  • Schmarotzer

876 Beiträge seit 04.07.2003

Grundsätzliche Gedanken zur Vererbung

Also ich finde das Vererbung ohnehin schräg ist. In der Natur scheint
die Vererbung anders zu Funktionieren. Ein Kind hat zwei Eltern,
Vater und Mutter. Wir hätten also so etwas wie Mehrfachvererbung.
Aber Das Kind erbt nicht alle Eigenschaften von Vater und Mutter
sondern von jedem nur 50%.

Und ist ein Kind automatisch vom Typ des Vaters und vom Typ der
Mutter? Ich denke hier muss man zwischen zwei Perspektiven
unterscheiden. Wenn ich mir anschaue wie ein Kind in der Natur
aufgebaut ist, stelle ich fest: Es besteht aus Organen, diese
Bestehen aus Zellen, diese bestehen aus Molekülen usw.. Also Systeme
bestehen aus Subsystemen und das ganze ist rekursiv. Das ist so etwas
wie die Bottom-Up / WhiteBox Perspektive. Wenn wir das Programmieren
würden, würden wir wohl ohne Vererbung auskommen. Wir programmieren
einfach die Subsysteme und setzten zu zusammen oder in Beziehung
zueinander und daraus ergibt sich das jeweils größere System.

Die gegenüberliegende Perspektive wäre wohl die Top-Down / BlackBox
Perspektive. In dieser Perspektive sehen wir nichts vom internen
Aufbau eines Systems, der aber trotzdem konkret vorhanden ist. Aus
den konkreten Aufbau, ergeben sich Eigenschaften des Systems als
ganzes (Emergenz). Bei einem Kind wäre das z.B. Größe, Temperatur,
Körperbau usw.. Dabei kann es dazu kommen, das Systeme mit völlig
unterschiedlichem internem Aufbau, gleiche Eigenschaften aufweisen.
Stein und Stahl sind z.B. beides harte Materialien, obwohl beide ganz
anders aufgebaut sind. Oder Schnabeltiere und Vögel haben Schnäbel,
obwohl beide diese Eigenschaft nicht von einem gemeinsamen Vorfahren
erbten, sondern unabhänhig voneinander entwickelten.

In der Softwareentwicklung wurde IMHO manchmal die Top-Down
Perspektive (vielleicht unbewusst) eingenommen und Klassen mit
ähnlichen Eigenschaften voneinander Erben lassen, obwohl diese vom
internen Aufbau besser unabhängig voneinander geblieben wären. Durch
die Vererbung wurden sie aber aneinander gekoppelt. Heute heißt es
"composition over inheritance". Wenn man Komposition der Vererbung
vorzieht wird das Design deutlich flexibler und IMHO kommt man dem
echten Aufbau der Systeme damit näher. Allerdings kann die
Wiederverwenung von Code auch umständlicher werden. Ich persönlich
versuche Vererbung nur noch dann zu verwenden, wenn eine Klasse auch
wirklich Subtyp des Supertyps sein soll und nicht nur die
Wiederverwendung abkürzen soll.

In letzter Zeit habe ich mich ein wenig mit Scala beschäftigt. Ich
bin mit dem Thema "Traits" noch nicht durch aber soweit ich das
bisher verstanden habe sehe ich Traits wie abstrakte Klassen in Java.
Ich kann Verhalten implementieren und auch abtrakte Methoden
deklarieren, die ein Subtyp implementieren muss. Ich kann diesen
Trait in eine Klasse integrieren, ohne dessen Typ zu übernehmen. Ich
kann meine Klasse aus mehreren Traits zusammensetzen. Man möge mich
korrigieren, wenn ich irgendwo falsch liege. Vielleicht sollte man
das nicht als Vererbung bezeichnen. Ist es nicht eher Komposition? 

Bewerten
- +