In unserem letzten Teil der Vorlesung 3.
Wir haben bis jetzt darüber gesprochen, was Polymorphie ist.
Wir haben darüber gesprochen, was dynamisches Binden ist.
Und die Gegenüberstellung von Implementations- und Typvererbung haben wir auch schon in vielen Teilen besprochen.
Nur noch, wie sieht das Ganze beim Sub-Tapping im Zug
auf Regeln aus? Was sollten wir dort machen? Was
sollten wir nicht machen? Das bezieht sich auf die Fragen
7 und 8. Da fuhr hier 40 geht es weiter,
ich möchte gerne noch zwei weitere Begriffe auseinanderhalten,
die Sie eigentlich schon mal gehört haben.
Das gehört leider zu diesen Begriffen, die man
irgendwie schwierig auseinanderhalten muss. Bitte bemühen Sie sich drum,
sie Ereignis, kleines Clousin, was bedeuten die verschiedenen Begriffe?
Diese Folien sollen ihnen dabei helfen. Zunächst erst mal,
sie haben alle mit damit zu tun, dass wir bei der Vererbung Spezialisierung einführen.
Also wir haben die vorhergehenden Bilder, zeigen so Hierarchien.
Und wenn wir, ich gehe mal hier zu diesem,
wenn wir also jetzt hier unten etwas neu machen wollten,
zum Beispiel, wir wollten das Dokument auswählen und Dokument entnehmen,
anders hier machen als oder hier, als es hier oben ist,
dann gibt es dazu Möglichkeiten der Spezialisierung.
Und diese Spezialisieren können wir
auf unterschiedliche Weise machen
Wir können das Spezialisieren machen, indem wir zunächst etwas neu schreiben.
Dass wir dieses Reh definieren. Redefinieren wäre bedeutend,
wir machen das anders als in der Oberklasse.
Wir machen es nochmal Reh im Sinne von nochmal.
Wir definieren es nochmal. Das Gleiche, das kennen Sie schon.
Das Beispiel ist jetzt hier auf einer der grundsätzlichen Methoden,
die Object bereit, die Klasse Object.
Sie wissen, das ist die Oberklasse von allem in Java.
Und diese Oberklasse von allem hat vier Methoden, die alle erben.
Und das Equals wäre im Vergleich geeignet. Ja,
dass man nicht nur vergleicht, ist das Objekt,
das identische Objekt, sondern auch ist es inhaltlich gleich.
Also dieser Vergleich, wenn noch was dazugehört, das muss man also speziell definieren,
wenn man auch noch die Member vergleichen will, die Instanzvariablen.
Ja, das E-Mails ist bei Objekt definiert, ja,
und das hat es da auch eine Implementierung,
aber wenn sie eine eigene Klasse haben,
müssten sie für die eigenen Members,
für die dort definierten Instanzfachviablen, die kleineren Intentionen jabeln,
da müssten sie das separat definieren.
Ja, aber es bleibt dieselbe Equiz-Operation nur woanders.
Wir definieren sie neu in einer Unterklasse von Object
Das Gleiche, dann etwas anderes,
was auch mit Spezialisierung zu tun hat, die ist überladen.
Polymorphie, das hatten wir schon, dass ich eine weitere Operation hinzufüge.
Zum Beispiel, wir haben den gleichen Namen, aber andere Parameter.
Also ich habe schon ein New-Konto ohne Parameter und jetzt noch New-Konto mit Betrag.
Ja, also diese Instanzierung ist hier möglich,
bei der Inzenzierung wird gleich eine Variante, ein Parameter mit übergeben.
Das ist ja der Konstrukt so, sie erinnern sich,
der Konstrukt war immer der Name der Klasse und hier ohne
Parameter und mit ein paar Metern
Wir fügen einen weiteren Konstruktur hinzu, das wäre das Überlagen,
redefinieren, wir nehmen die gleiche Schnittstellensignatur,
also sowohl Name der Operation als auch Typ und schreiben den quasi neu,
redefinieren, ja, und redeklarieren, wir ändern die Schnittstelle.
Diese Änderung der Schnittstelle sollte ein bisschen,
sollten wir ein bisschen genauer, das sollte nicht gleich sein,
wollen wir ein bisschen genauer angehen. Es sollte die Möglichkeit,
blicke bleiben, hier das Setzung zu hinzukriegen, ja,
die Ersetzung hatten wir ja in so einem Bildchen,
mal sehen, ob ich jetzt gleich zum Richtigen zurückspringe,
also es sollte hier immer möglich sein, überall wohl Archiv gefordert ist,
dass ich dann Box oder Ort noch hinzufüge.
Überall, wo Ablage möglich ist, sollte ich stapel,
Box, Bord noch oder was auch immer hier unten drunter noch ist,
einzueinfügen können.
Und diese Ersetzbarkeit ist ganz wichtig. Deswegen können wir das
relativ wenig deklarieren. Also der Name der Operation,
die Reihenfolge der Parameter, muss gleich bleiben,
Neurotypen können wir ändern
So. Lassen Sie uns dazu kommen, wie das Ganze mit dem Vertragsmodell aussieht.
Hier spielt diese Ersetzbarkeit eine ganz wichtige Rolle.
Und diese Ersetzbarkeit hat auch einen Namen.
Ich erwähne den hier schon mal in Vorlesung 10,
wenn wir detailliert darauf einkommen, das ist das liskosche Ersetzungsprinzip.
Das ist eines von den Prinzipien der Objekte und jedem Programmierung und
des guten Entwurfs. Für den Vertrag sieht das so aus,
dass es die Umsetzung auf das Vertragsmodell, die Untertypen,
die wir bei der Spezialisierung einführen, die dürfen dem Vertrag nicht verschärfen.
Sie müssen den gleichen Vertrag haben
Lassen Sie uns das anschauen. Was ist denn hier möglich,
hier erstmal wieder ein paar Folien mit dem für die Cracks,
die ich jetzt nicht im Detail weiter erläutere,
sondern die sie sich selber anschauen können.
Also hier gibt es eine Deklaration einer Signatur. Und was hier zulässig ist,
das würde ich aber jetzt nicht weiter diskutieren,
das ist weiterführendes Material, was sie sagen,
was sie für die Quecks unter irgendwie weiter interessiert sind,
sich das anschauen können,
bitte schauen Sie auch durchaus in Java-Büchern dazu
Das hat einige Probleme. Und deswegen haben wir das aus einer normalen Vorlesung rausgehoben.
Was wir aber, hier geht es weiter für alle,
das Vertragsmodell mit der Ersetzbarkeit und der Nichtverschärfung.
Lassen Sie uns das an, im Detail diskutieren.
Sie erinnern sich, das Vertragsmodell hat zwei Bestandteile.
Was war für Klienten, was war für Dienstleistungen?
Beide hatten eine Vor- und eine Nachbedingung.
Die haben Dienstleister der Klient, stellt sicher,
dass die Vorbedingungen alle
geschaffen sind
Dann ruft er den Dienstleister auf und der Dienstleister,
wenn eine Vorbegehung geschafft sind, garantiert, dass er die Dienstleistung entsprechend erbringt.
Das ist die Vor- und die Nachbedingung, die haben wir als Prä- und Post.
Und zwar diese Bedingung für Dienstleister zum Beispiel, der erfordert,
dass die Vorbedingungen da sind und er sichert,
dass die Nachbedingungen erfüllt sind,
also die Vorbedingungen,
zum Beispiel ein Kunde existiert schon in meinem Datenbestand und die Nachbedingung ist,
ich buche etwas auf sein Konto
oder so etwas
So, und diese Verträge, die können weitergegeben.
Also es geht hier um die Dienstleisterseite. Und diese Verträge können
weitergegeben werden im realen Leben, können sie das einem Zulieferer weitergeben.
Ja, was weiß ich, sie haben eine Firma,
die Fenster einbaut in Häuser und sie bauen die Fenster aber nicht selber,
sondern sie kaufen die Fenster zu.
Und da darf natürlich der Zulieferer nicht sagen,
ich habe hier schärfere Bedingungen als die anderen Fotos.
Ja, also ich fordere,
der Zulieferer von uns jetzt plötzlich andere Befestigungsmöglichkeiten als der Hauptlieferer,
der muss sich da schon einfuckt packen
Und sie müssen dazu liefern, muss die Leistung erbringen, die der Publivalen verspricht.
Also zum Beispiel, sie versprechen fünf Jahre Garantie, aber ihr Lieferant,
der Zulieferer, der verspricht nur ein Jahr Garantie.
Ja, was passiert in den restlichen vielen Jahren?
Da ist irgendwas faul. Also das muss mindestens das sein,
wenn der zehn Jahre Garantie bietet, umso besser.
Ja, dann können sie das weiterreichen und sagen,
ja, in dem speziellen Fall wird das spezielle Fenster,
kriegen sie sogar zehn Jahre noch ein Team.
Also das ist, hier haben wir das Wort Zulieferer dafür verwendet, für die Verfeinerung des Dienstleisters. So,
wenn wir das jetzt mal umsetzen, auf schwächer und stärker,
sorry, das sollte nicht passieren,
wenn wir auf schwächer und stärker das umsetzen,
dann müsste die Vorbedingung des Untergeordneten, hier ist ja der Subtyp,
und das ist der super Typ, die sollte schwächer sein,
nur die Nachbedingung sollte stärker sein oder gleich.
Ja, so. Schauen wir uns das mal im Beispiel an.
Wir haben hier den Anbieter, der hat ja liefert Moorstücke.
Ja, so. Und das wäre eine Beziehung,
Kunde, Anbieter und die schließen den Vertrag
Und wir haben, und der Anbieter liefert dann diese Bohrstücke.
Und zum Beispiel wird sichergestellt, okay, die Toleranz,
wenn da, wenn nicht mehr als 500 Euro bezahle,
dann gibt es hier eine Toleranz von 20.
So, wir haben hier, das ist,
es geht um dieses, um diesen Dienstleister,
das ist der Klient, das ist der Dienstleister, in dem Fall.
Und hier werden wir, machen wir eine ein Subtyp davon
und dieser Subtyp, den bezeichnen wir jetzt immer als Zulieferer.
Und wenn der jetzt hier seine Bedingungen in der Form erhöht,
er will mehr Preis als der hier einnimmt.
Oder er sichert weniger Toleranz, dann ist da irgendwas faul.
Das wird nicht funktionieren. Das klappt so nicht. Auf der Objektebene würde das so aussehen,
dass wir die Zuweisung, nämlich den Aufwurf der Operation,
ein C weitergeben, weil ein Exemplar der Klasse C,
in der Stelle steht, wo eigentlich das Exemplar der Klasse B sein sollte und das muss man hier noch beide.
Genau. Und das darf nicht in diesen Bedingungen sein und da,
wenn wir das so machen, zum Beispiel der Preis ist kleiner,
dann verdient B noch ein bisschen was,
die Toleranz ist besser,
dann ist A noch ein bisschen mehr zufrieden.
Das wäre erlaubt. Ja, Verschärfen von Vorbedingungen aufweichen für
Nachbedingungen wird verhindert. Das ist eine wichtige Forderung,
die wir hier erheben müssen
Das kann typischerweise der Compiler nicht prüfen. Und zwar kann er
es deswegen nicht prüfen, weil wir ja die Vor- und
die Nachbedingungen nicht im Rahmen der Programmiersprache Java bilden würden.
Es gibt Beispiele, wo Programmiersprachen Vor- und Nachbedingungen darstellen können.
Ein Beispiel ist die Spracheifel oder EFL von Betonmeier,
ein Schweizer Informatiker, im großen, sehr begründen Informatiker,
ist das entwickelt worden für defensiven Programmierspiel,
also Vermeidung von Fehlern.
Und hier kann man Vorbedingungen und Nachbedingungen
in der Sprache formulieren
Ja, das heißt, die Sprache hat Ausdrucksmittel dafür und
dann kann man das, kann der Compiler das prüfen,
beziehungsweise zur Laufzeit, das Laufzeitsystem kann das überwachen.
Hier gibt es Vor- und Nachbedingungen und in Variante.
Ja, es gibt auch weitere Programmiersprachen,
die dieses Vertragsmodell einbieten und hier sind ein paar genannt.
In Variante, das vielleicht noch ein Wort dazu,
in Varianten, sind etwas, wo ich sicherstelle,
dass ich damit daran nichts verändere.
Vorher und nachher haben wir den
gleichen Inhalt zum Beispiel für Konsistenzbedingungen,
kann man
das nutzen
Und diese In-Varianten spielen hier auch noch,
wir müssen hier auch noch entsprechend mitvererbt werden,
müssen weitergegeben werden, sie können zwar verschärft werden,
aber der Untervertrag muss das immer,
also die Spezialisierung darf das haben, aber ansonsten ist es gefährlich,
man muss diese In-Varianten sehr genau beobachten.
Also hier ist es, wenn wir 18 Report haben,
dann hat der mehr Vorbedingungen,
mehr Bedingungen
als die Allgemeine hat
Oder wenn wir so wollen, in unserer,
wenn wir gerade hier in der Uni sind,
die Gesamtprüfungsordnung der Uni hat so ein paar allgemeine Regeln,
die Prüfung der Terminfakultät hat Prüfungsordnung,
hat noch ein paar speziellere Regeln und die Prüfungsordnung des Studiengangssystemsoftwaresystementwicklung hat noch speziellere Regeln.
Ja, das wäre dann sicher ein Bedingung. Ein weiteres
Beispiel Generizität ist die Vererbung und wir wollen das mal betrachten
am Beispiel einer Liste von Strings und einer Liste voll Objekten.
Die Liste von Strings ist hier in der In diesem Element enthalten misst,
sie erinnern sich, war ein Interface,
ja, und redest mal ein konkretes Objekt, sorry,
eine konkrete Klasse, was ist Interface implementiert?
Und die Frage ist jetzt hier, was kommt da raus?
Ist das zulässig? Ja, ist hier eine solche Zuweisung zulässig,
dass die Objektliste, wenn die Objektliste das gesetzt wird,
was die Linkliste macht? Das ist die große Frage,
ist es möglich, dass ich hier,
wenn ich da nämlich diese Zuweisung gemacht habe, ist es möglich hier,
dass ich hier ein Ad durchführe oder dass ich hier das mache.
Also das ist nicht erlaubt, es wird ein Fehler
zur Übersetzungszeit bringen und das wäre ebenfalls nicht erlaubt.
Deswegen ist die Vererbungsrechte, die Vererbungs,
die Anpassung im Vererbungsrichtung ist nicht typsicher und wir haben dieses Beispiel mit dieser Nahrung,
hatten wir ja schon mal, machen wir nochmal,
da passt das nicht.
Lassen Sie uns das kurz zusammenfassen, Vererbung ist ein ganz wichtiges Konzept,
aber, das ist das Aber, Gefahr besteht,
dass man es missversteht.
Und deswegen beziehen wir uns vor allen Dingen auf das Subtyping.
Die Typ-Hierarchie und die Typ-Abstraktion, das ist für uns das Zentrale Element.
Und die Implementationsvorerbung ist eher gefährlich. Wir kommen dazu später
auch nochmal. Aber jetzt, hier müssen Sie unbedingt behalten.
Wir fassen Dingen zusammen mit ihren Gemeinsamkeiten. Die Unterschiede werden
auf untere Ebene abgebildet und die oberen Sachen werden zusammengefasst.
Und wir wollen, dass eben Vertragsmodellen dafür machen,
dass wir Dinge aus Sicht des Aufrufers,
des Klienten zusammenfassen und dass er die Details nicht wissen braucht.
Damit sind wir vom Ende und vielen Dank
fürs Mitwirken