Hallo, herzlich willkommen zur neuen Vorlesung. Hier geht es
diesmal um Typen, um Vererbung. Das sind alles Themen,
die bei Programmierern eine große Rolle spielen. Und die Agenda heute ist,
wir starten damit zunächst erst mal darüber zu sprechen,
was Vererbung ist, wofür sie sie brauchen.
Und dann geht es um Typhierarchien, Subtyping.
Dieser schwierige Begriff Polymorphie, den wollen wir leicht verdaulicher machen,
beleuchten. Und wie weit sollen wir Vererbung verwenden?
Welche Konzepte gibt es überhaupt? Und insbesondere dann,
wie wirkt sich das aus? Wie spielt das
zusammen mit dem Vertragsmodell
Sie das schon kennen, gibt es wieder Fragen dazu.
Wir werden zu den einzelnen Fragen dabei zurückgehen. Lassen Sie
uns zunächst erst mal starten mit Vererbung. Tatsächlich ist es so,
dass viele Programmiersprachen, Ausbildungen mit Vererbung anfangen,
wenn es um Objekt, um Objektorientierung ging.
Viele objektorientierte Lehrbücher für C plus plus Sichap, Java,
haben Vererbung ganz zu Anfang. Als Grundkonzept der Objektorientierung. Bei uns haben Sie vielleicht gemerkt,
dass Vererbungen erst relativ spät eine Rolle spielt, das hat damit zu tun,
dass es durchaus Gefahren gibt und deswegen kommen wir jetzt erst dazu,
das so richtig im Detail zu behandeln.
Wichtig ist, oder warum macht man überhaupt Vererbung eingeführt?
Informatiker wollen gern automatisieren. Informatiker wollen gern sparen,
ja, und außerdem ist es relativ schlecht,
doppelten Code zu haben, Duplikate, Clones, ja,
und deswegen hat man versucht, Konzepte zu entwickeln,
die man gleichartig mehrfach verwenden kann.
Also man könnte sagen, Wiederverwendung, mehrfach Verwendung,
ja, und das ist das,
was sie sicher schon kennen,
dass man
mehrfach genutzte Funktionalität irgendwie auslagert
Auf jeden Fall gibt es dieses Konzept des Moduls,
des Unterprogramms, wo man Funktionalität in eine private Methode
auslagert und alle anderen Methoden eine Klasse können das benutzen.
Oder über Klassen hinweg, dass man öffentliche Methoden bereitstellt,
die andere Klassen dann benutzen können. Und was wir jetzt machen,
ist das Konzept Vererbung als etwas besprechende Zusammenfassung von Gemeinsamkeiten.
Gemeinsame Sachen zusammenfassen in einem anderen Konzept.
Ich möchte hier ein Beispiel bringen aus Motorensteuerung,
wo wir zeigen, wie so ein Überkonzept geordnetes Konzept
aussehen kann
Eine Motorsteuerung ist dafür verantwortlich in einem Motor.
Hier ist es zum Beispiel ein Benzinmotor mit Direkteinspritzung.
Ich habe hier so eine Fantasiebezeichnung genommen. Vielleicht haben sie
schon mal gehört, irgendwie TDE-Motor oder so.
Ja, also eine fensive Verbrennungsmotor, der wird gesteuert.
Und zwar wird er nicht nur so wie ganz in den
Anfangszeiten gesteuert, dass man beim Gaspedal eine Klappe aufmacht.
Und er wird mehr oder weniger Luft zugesteuert,
die mehr oder weniger Benzin gemähdampft mit sich führt.
Nein, man wird das je nach Belastungsgrad des Motors,
je nach Temperatur des Motors
Je nach Drehzahl wird man zu bestimmten Zeitpunkten da Benzin einspritzen oder einsteuern,
sodass man die optimale Verbrennung erreicht, dass das also nicht so unverbannt ist,
hinten rausgeht, dass es wichtig für den Benzinverbrauch,
dann kann man darüber ein bisschen beeinflussen, wie die Schadstoffe sind,
all solche Sachen spielen bei einer Motorstörung eine Rolle.
Das wollen wir aber nicht genauer angehen,
wir wollen einfach nur sagen, okay, es geht bei diesen Motoren,
nehmen wir an, wir haben ein 1,8 Liter DTI-Motor,
also TTI steht für Direkteinspritzung und 1,6 Liter,
TTI bei beiden ist es gemeinsam, sie haben eine unterschiedliche Steuerung,
klar, sie haben unterschiedliche Motorparameter, einfach kleiner und größer,
sondern manche Sachen sind vielleicht wirklich unterschiedlich.
Aber sie haben gemeinsam, es gibt Messparameter,
und zwar gibt es vielleicht die gleichen Messparameter wie Drehzahl,
Temperatur, Belastungsgrad.
Also Drehmoment. Und danach wird die Einspritzung, die Benzinzufuhr gesteuert.
Und das Gemeinsame, sie sehen schon hier diese Pfeile,
die Pfeile mit dem leeren Dreieck.
Was ist das?
Was stellt das da
Kurz überlegen. Ja, das ist die Vererbung,
aber besser wäre noch der Begriff, Generalisierung.
Also das Generalisierte, das verallgemeinerte Konzept ist hier oben,
am Ende des Pfeils und am anderen Ende ist das spezielle Konzept.
Also Spezialisierung ist in diese Richtung Generalisierung ist in dieser Richtung.
Also dieser Pfeil, bitte merken, Generalisierung,
der Pfeil gehört zur UML, der Unified Motoring Language
und ist dort vor allen Dingen ein Klassendiagramm anzutreffen.
Gibt es aber einen anderen Diagramm auch noch
So, also das ist die grafische Darstellung dessen,
dass wir ein übergeordnetes Konzept haben.
In dem Fall das Gemisch nach Messparametern abstimmen.
Und da können wir viele Sachen definieren,
die wir bei dem anderen dann auch haben.
Sowohl bei dem 1,6 Liter der Muttersteuerung für den Motor als
auch für eine 1,8 Liter Motor.
Und damit kann man vermeiden, dass man manche Sachen doppelt schreiben muss.
Das ist sicherlich vorteilhaft, man muss Fehler nur einmal beheben.
Oder dass man manche Sachen auch nur einmal sich ausdenken muss.
Also mehrfach genutzte Sachen werden ausgelaugt
Ja, nun Vererbung. Ja, was sie schon kennengelernt haben,
ist die Typvererbung mit Interfaces. Interfaces behalten beinhaltet eine Verpflichtung,
dass die untergeordnete Klasse ein Interface implementiert,
Interface heißt also bestimmte Methoden mit ihren Parametern implementiert.
Hier gibt es den Begriff Vererbung, das kennen wir aus dem allgemeinen,
aus dem täglichen Nebenvererbung ist etwas, man übernimmt etwas von seinem Vorfall.
Bei Softwareobjekt und jeder Software ist das so,
von der Oberklasse kann die Unterklasse etwas übernehmen, vererben
sie wissen auch im täglichen Leben, dass man bei der Erbschaft,
wenn also die Großlande stirbt, sollten sie doch genau hinschauen,
was sie da als Erbe angeboten kriegen.
Denn man kann den Erbe auch ausschlagen, wenn es
zum Beispiel nur Schulden enthält. Oder eine Verpflichtung enthält,
sie sollen sich um so einen alten Bauernhof kümmern.
Dass die Verpflichtung ist noch ein bisschen was anderes.
Hier ist die Interfaces bringen eine Verpflichtung mit für alle untergeordneten Klassen.
Diese Methoden zu implementieren. Sie wissen,
das sind dann abstrakte Methoden bei so einem Interface und da
fehlt der Quellcode des Buddy
Das ist der eine Punkt. Der andere Punkt ist,
was mit den Aufrufen ist. Ja, also der übergeordnete
Typ kann auch die Operation, also die Methoden des Übungautototyps,
können auch von Untertypen, von Subtypen aufgerufen werden.
Wir schauen uns das gleich mal an ein Beispiel an.
Und die Variablen, die wir in dem allgemeinen Typ haben,
können durch speziellere Variablen belegt werden.
Also wenn wir irgendeinen Variable haben, die nur Typ Object ist,
bei Java, sie wissen, Object ist alles,
das steht überall, dann können sie jedes,
die Variable mit jedem beliebigen Typ belieben.
Ja, und wenn sie Intager ist,
dann können sie sie nur mit Subtypen,
unter Typen von Intager belegen
Was wir jetzt neu haben,
was wir jetzt einführen wollen in visuelle Lehrveranstaltung, ist Implementationsvererbung.
Wo wir wirklich Quellcode weitergeben. Ja, und das ist jetzt der Unterschied,
was in vielen Lehrbüchern sehr viel früher behandelt wird.
Wir machen das jetzt erst, weil wir sie mit
den Gefahren, auf die Gefahren aufmerksam machen wollen.
Ja, es gilt dafür bestimmte Regeln.
Und diese Regeln sind für uns ganz wichtig,
damit man am Ende nicht ein schlechtes, eine schlechte Verständlichkeit,
schlechte Marktbarkeit, hohen Änderungsaufwand erreicht.
Also bei der Implementationsvererbung,
hier geben wir eine Verpflichtung weiter,
den Typ einzuhalten
Und hier geben wir tatsächlich Quellcode weiter. Die Unterklassen enthalten,
Implementation, also den Quellcode, die Implementation nebenbei märkte.
Was heißt das? Das Implementation heißt Verwirklichung. Ja,
vielleicht ist das Fremdwort des Tages Implementation als Verwirklichung.
Also die Unterklassen enthalten Quellcode der Oberklassen und die Unterklassen
sind Spezialisierung in der Oberklassen. Das ist ganz wichtig.
Wir kommen später noch am Prinzip dazu, zurück, was das benennt.
Und gleichzeitig in der umgekehrten Richtung gibt es eine Abstraktion.
Die Elternklassen abstrahieren von den Unterschieden der Unterklassen. Also hier war das so,
die Mote, die allgemeine Motorsteuerung, die Unterschiede der beiden,
für speziellen Motorsteuerungen, ignoriert, weglässt, ja,
das ist nicht relevant, die Abstraktion wird hier zusammengefasst.
Und da haben wir bis jetzt das Abstraktionsmittel. Interface gehabt,
ja, also Interface, zum Beispiel die Liste,
definiert irgendwo etwas, zum Beispiel, dass irgendwelche Operationen,
da wird zugreifen können, dass wir zum nächsten haben,
dass wir eine Anzahl von Elementen haben und so etwas und die Dieses Interface kann keine Instanzen bilden,
keine Exemplare bilden.
Deswegen nicht, weil verschiedene Sachen abstrakt sind, nämlich abstrakte Methoden.
Ja, und da können wir konkrete Klassen,
echte Klassen ableiten, die dann wieder Exemplare haben können.
Also in dem Fall hier die Linklist und die Arrelist
als verschiedene Implementationen, dieses Typen. Ja,
und wenn wir das hier so sehen, sehen wir hier,
wir können tatsächlich, oder wir im Namen,
eine Relist implementieren oder dann hier
eine Linklist implementieren
Dieses Prinzip der Aufteilung der unterschiedlichen Behandlung von Typen und Implementationen,
das haben Sie schon kennengelernt. Und zwar, dass eine Klasse,
sowohl aus der Typbezeichnung besteht, das ist die Schnittstelle,
das Interface in manchen Programmiersprachen wird das auch Header genannt,
während das hier im Body ist, die Implementation,
also diese Aufteilung von Header und Body ist sehr üblich,
weil sie die Voraussetzung dafür steht, dafür steht,
dass man Informationen ab Informationen weglassen kann.
Information Heiding klingt so ein bisschen böse,
ich möchte was vor dir verstecken,
Nein, es geht nicht um das Verstecken,
sondern wir wollen Details der Implementation nicht betrachten müssen.
Das reicht, wenn wir für die Klasse,
meine Klasse benutzen, reicht es, die Typbeschreibung zu betrachten.
Normalerweise sollte das so sein. Und weil die Operationen allein
der Name vielleicht das nicht sagt, gibt es noch Schnittstellen, Kommentare.
Aber sie müssen sich eigentlich die Implementation nicht anschauen.
So ist das Ziel. So,
und das Interface hat nur diese Typinformationen,
Operationen und Stiftchen-Kommentare und diese Informationen gewinnen von den Unterklassen
auch eingangen.
Von den implementierenden Klassen
So, damit wollten wir hier erstmal Schluss machen und
es gibt eine separate Einheit für das Nächste.
Doch vorher schauen wir nochmal die Frage dazu,
ein Ops, das war nicht die richtige, ja,
also der Mehrwert der Vererbung, weil es ist sinnvoll,
Vererbung anzuwenden. Dazu werden wir nochmal separat kommen,
aber zunächst erstmal der Wehrwert von Vererbung besteht darin,
dass wir Dinge zusammenfassen können.
Und schauen euch jetzt schnell die richtige Folie finde
Genau. Abstraktionen bilden. Das war das Vorhergehende.
Hier, überordnet Konzepte zusammenfassen. Das ist das, was
wir besonders erreichen wollen. Dinge auslagern, Publikate vermeiden,
da sind Vorteile, die wir von Vererbung von uns versprechen.
Deswegen hier Vererbung einsetzen. Sinnvoll ist es,
Vererbung anzuwenden. Immer dann, wenn wir gemeinsame Konzepte haben
Es gibt auch einen Punkt, wo Vererbung nicht sinnvoll ist,
nämlich dann, wenn wir Zyklen erzeugen würden.
Zyklen wissen sie schon, Informatiker, Hassenzyklen, wie der Teufel, der Zweiwasser.
Also Zyklen dürfen wir nicht erzeugen. Dann ist es manchmal besser,
etwas zweimal zu implementieren. Ja, und die schlechte Vererbung,
die Gefahren von Werbung, die wären dann,
wenn jemand nur auf die Einsparung von Quellcode shielt und dabei die Spezialisierung falsch anmeldet.
Dazu werden wir aber ein bisschen später kommen.
Jetzt machen wir erstmal kurz einen Break bis zum nächsten Einheit
ist separat