Hey, da bin ich wieder mit dem zweiten Teil
und muss gleich ganz am Anfang einen Fehler korrigieren.
Ich habe mich schon gewundert, warum da die eine Buchung abgelehnt wurde.
Das letzte Mal, als wir das ausprobiert haben,
am Ende von Video 1. Und halt auch gar keine Sollzinsen eingefallen sind beim Girokonto.
Ich hatte das Beispiel dann mit dem Girokunden schon so gebaut, dass das Konto auch mal überzogen wird und das mal Sollzinsen anfallen. Das Ganze liegt daran,
dass bei dieser Variable hier Zinssatz und Dispo auf der rechten Seite jeweils ein Unterstrich da ist,
den man wegen dieser unterkringelten gelben Linie nicht sieht,
sodass wir im Prinzip den Dispo,
der er mit null initialisiert ist als Int,
sich selber zugewiesen haben und den Zinssatz auch,
was natürlich irgendwie höchstens mittelsinnvoll ist,
wenn ich jetzt hier diesen nicht ganz wirklich sichtbaren Unterstrich wegnehme,
geht auf die gelbe Linie weg,
das Gleiche mache ich hier auch und wenn ich jetzt das Ganze nochmal speicher und laufen lasse,
dann Irgendwie wird das immer nichts.
Dann kommen hier halt auch mal ein paar Soll-Zinsen raus.
Das heißt, es sind deutlich plausiblere Ergebnisse.
Es lag einfach daran, dass ich nicht gesehen habe,
dass ich hier im Prinzip die Exemplarvariable sich selber zugewiesen habe.
Okay, gucken wir uns jetzt aber mal an,
ob wir das Ganze ein bisschen schöner bauen können.
Dazu mache ich hier auch nun mal das Sparbuch auf.
Ziehen wir das hier so rein, sodass wir beides vergleichen können.
Und da fällt uns auf,
dass sowohl Zinssatz als auch Kontobewegungen in beiden Klassen
drin sind
Die Methode zahle ein. Auch, die sieht auch in beiden Klassen gleich aus.
Also können wir jetzt wieder Implementationsvererbung anwenden und bauen uns eine
neue gemeinsame Oberklasse von den beiden mit New Class,
die nennen wir Konto.
Wir brauchen hier keinen Konstruktor in diesem Fall und dann können
wir das gemeinsame ja aus den beiden Klassen da reinziehen.
Also nehmen wir hier erstmal Die Kontobewegung und schneiden sich hier
aus, packen sich hier wieder rein.
Und das Gleiche machen wir mit Zinssatz. Jetzt wird hier gesagt,
hey, ich kenne Zinssatz- und Kontobewegung gar nicht mehr,
das hat zwei Gründe.
Als erstes muss ich, Giro konnte erstmal vom Konto erben lassen,
also Extense,
Und als Sparbuch natürlich auch, Extense. Konto. Und
zum Zweiten sind die beiden ja private nur in dieser Klasse sichtbar.
Ich muss sie protected machen. Zinssatz auch. Wenn wir
jetzt speichern, dann hört das Schimpfen auf.
Aus Sparbuch können wir jetzt das hier auch rausnehmen,
weil wir es ja in der gemeinsamen Oberklasse haben
Von Sparbuch und Girokonto. Ah, jetzt gibt es ein bisschen Gemecker,
weil ich konnte mit einem großen Uhr geschrieben habe.
John ist alles gut. Die Methode zahle ein, ist,
wie man hier sieht, ja bei beiden auch komplett gleich.
Das heißt, ich schneide das wieder hier aus.
Pax in Konto. Und hier kann ich
es einfach löschen
Gucken wir uns das Weitere an. Hebe ab,
Hebe ab, können wir nicht nehmen,
weil Hebe ab unterschiedlich implementiert ist,
weil ob wir jetzt was zu den Kontobewegungen hinzufügen oder eine Fehlermeldung ausgeben,
hängt eben von unterschiedlichen Bedingungen ab in Sparbuch oder in Girokonto.
Also können wir das nicht mit hochziehen, berechen Roseilo,
wie sieht es denn bei berechten Roseldo aus? Gut,
da habe ich jetzt die lokale Variable leicht unterschiedlich genannt,
aber das ist ja nur eine lokale Variable.
Ansonsten sieht die Berechnung komplett gleich aus
Also ist das auch was, was wir in die gemeinsame Oberklasse ziehen können?
Jetzt machen wir jetzt auch mal... Können wir hier diese eklige Leerzeile rausnehmen?
Und hier können wir berechnen, Rosaldo eigentlich komplett löschen,
weil wir es ja schon nach oben gezogen haben.
So, dann habe ich hier, gibt Kontostand offensichtlich,
ob ich eine leicht andere Reihenfolge der Methoden bei beiden gewählt,
Kontostand besteht aus Brechen Roselde und berechnet Zinsen.
Die Poncho stand hier unten, besteht aus Brechen Rosaldo und
berechnet Zinsen. Sieht komplett gleich aus. Können wir also
quasi hier ausschneiden. In Konto hochziehen. Und hier
auch löschen
Berechnende Zinsen ist wieder bei beiden unterschiedlich,
weil das eben soll- und haben Zinsen sind.
Hier haben wir Haben Zinsen. Und hier berechnen wir ja
Sollzinsen. Das können wir also nicht hochziehen. Gucken wir
uns an, was es sonst noch so gibt.
Mache Jahresabschluss. Mache Jahresabschluss sieht auch bei beiden gleich aus.
Ich habe hier eine Variante durch Implementationskommentare reingemacht habe,
hier nicht, also ziehe ich die hier nach oben
Genau, da muss man einfach mal das hier löschen auf
der Seite. Und dann haben wir noch Drucke und da
haben wir dann hier für das Sparbuch war der Kontostand,
ist dabei betrug der Saldo.
Es sind folgende Habenzinsen angefallen. Dann haben wir hier Girokonto
Auszahlungen, sind folgende Sollzinsen angefallen. Die sind also nicht gleich,
also lassen wir die erstmal da, weil die einfach
einen anderen Text haben und er auf die Kontoart verweisen.
Die Zinsberechnung ist, wie gesagt, auch bei beiden unterschiedlich.
Die können wir auch nicht nach oben ziehen.
Also haben wir jetzt einfach erstmal alles gemeinsame.
Ich speichere das mal eben, ziehe das wieder rüber,
sodass ich hier Konto größer machen kann.
Weil wenn wir uns das hier jetzt ansehen,
wird das Ganze rot unterkringelt,
weil berechnet Zinsen in der Klasse Konto
überhaupt gar nicht bekannt ist
Und wir es ja aus Sparbuch nicht mit hochziehen konnten.
Und aus Girokonto auch nicht mit hochziehen konnten,
weil die Zinsen nehmen unterschiedlich berechnet werden.
Also wäre es hier irgendwie ganz cool, ach ja,
mit Drucker sehen wir hier, ist genau das gleiche.
Druck haben wir auch nicht nach oben ziehen können.
Ist in der Klasse Konto nicht vorhanden. Findet also
hochgradig komisch. Also wer ist ja ganz gut,
wenn wir irgendwie so eine Art Platzhalter haben könnten,
der irgendwie gar keinen Rumpf braucht.
Aber trotzdem sagt, hey, berechne Zinsen kommt irgendwo
anders her
Also bauen wir uns jetzt einfach mal einen Methodenkopf,
der aussieht, wie die Signatur von berechnet Zinsen.
Also Public, Double. Berechne Zinsen. Genau. Jetzt sagt er
mir hier, also hier oben ist das Rote weggegangen,
weil es gibt ja jetzt hier irgendeinen Methodenkopf mit berechneten Zinsen.
Jetzt sagt er mir hier, wenn ich da drüber gehe,
einfach nur so einen Methodenkopf, Ohne Rumpf geht nicht.
Es sei denn, man macht diese Methode abstrakt.
Also schreibe ich jetzt, anstatt Public Double, Public Upstract.
Dabu. Jetzt meckert er immer noch,
weil man abstrakte Methoden nur in abstrakten Klassen haben darf.
Also machen wir die Klasse auch noch abstract.
Dann ist diese Klasse auch Public Upstract.
Dann klares Konto und schon hört die Schimpferei hier auf
Das Gleiche machen wir mit Drucker auch.
Public. Upstruct. Drucker. Ganze nimmt ein Int entgegen
und zwar Rosaldo.
Und ein Double Zinsen.
Ich gucke gerade, warum er hier noch, ach ja,
ich habe den Rückgabetyp vergessen und schon funktioniert das.
Kaum macht man es richtig, schon funktioniert es.
Warum haben wir diese Klasse abstrakt machen müssen?
Wir wollen von Konto kein Exemplar erzeugen können.
Könnten wir ein Exemplar davon erzeugen? Im Prinzip ist es
die gleiche Begründung wie bei einem Interface.
Und würden dann auf diesem Exemplar berechnet Zinsen aufrufen,
dann würde das ganz intensiv nichts machen,
weil berechnet Zinsen nun mal
keinen Rumpf hat
Und man kann von abstrakten Klassen kein Exemplar erzeugen.
Deswegen haben wir diese Klasse abstract gemacht. Dann hat er
mit uns hier unten auch nicht mehr geschimpft,
dass wir hier nur Methoden Köpfe hatten.
Das ist das ist das Gleiche wie eine Operation in einem Interface.
Und jetzt kommen wir auch zu dem Begriff Einschubmethode und Schablonen-Methode.
Im Prinzip ist diese Methode Mariahesabschluss, eine Schablone.
Weil das hier kann man diese Stellen,
wo brechen Rosaldo und Drucke, steht,
kann man wie quasi die Löcher in so einer Schablone sehen
Eingeschoben, werden dann diese Platzhalter hier, die in den erbenden Klassen implementiert werden müssen. Wenn ich jetzt hier in Sparbuch,
zum Beispiel berechnet Zinsen gar nicht drin hätte,
das kann ich ja mal ausprobieren,
indem ich das einfach auskommentiere, ich mache hier einen,
markiere das, mache Steuerungsshift 7 und habe alles auskommentiert,
das ist übrigens auch der Shortcut der Woche,
ich habe halt in den Übungen von Platz 3,
da solltet ihr auch was auskommentieren, gesehen,
dass so der eine oder andere, da hatte ich den Eindruck,
der hat mühsam in jede Zeile ein Double Slash gemacht,
deswegen Shortcut der Woche einfach den gesamten Bereich markieren,
Steuerungsshift 7 ist einkommentieren, wenn es auskommentiert war und auskommentieren,
wenn es eben nicht auskommentiert war, wenn ich das Ganze jetzt speichere,
dann meckert er mir hier Sparbuch an, weil Sparbuch von Konto erbt,
Konto hat eine abstrakte Methode, berechnet Zinsen,
also muss ich in den erbenden Klassen die Implementation anbieten,
das mache ich nicht.
Ich hätte als Alternative, dass ich diese Klasse auch abstruct mache,
dann könnte von Sparbuch auch kein Exemplar erzeugt werden und irgendeine Klasse,
die von Sparbuch erbt, müsste dann die Methode berechnet Zinsen implementieren,
aber irgendeine Klasse in dieser Vererbungshierarchie muss das machen,
da ich nicht noch weitere Werbungen haben will,
kommentiere ich das einfach wieder ein,
das war ja auch nur,
um euch das zu demonstrieren und schon Hört das Gemäcker auf.
Ich klicke hier mal wieder doppelt drauf,
dass ich hier mein Package-Video auch wieder habe. Genau,
und so haben wir im Prinzip einiges an Code oder den gesamten Code,
der in beiden, sowohl in Sparbuch als auch in Girokonto
vorhanden war, nach oben ziehen können.
Und sogar Code der Methoden benutzt hat,
die wir nicht nach oben ziehen konnten,
weil wir dann einfach diese Methode,
mache Jahresabschluss,
quasi zur Schablonenmethode gemacht haben und brechen Rosaldo und berechne
Zinsen zu Einschubmethoden
gemacht haben
Wenn wir jetzt hier wieder aufs Start-up gehen, Run is Java Application,
dann kommt hier im Prinzip das Gleiche raus wie vorher,
nur mit ein bisschen schönerem Code oder deutlich schönerem Code.
Jetzt haben wir ja in beiden auch noch die Methode drucke.
Das Einzige, worin sich diese Methode drucke,
bei beiden unterscheidet, ist,
dass wir hier beim Sparbuch Sparbuch stehen haben und Hier haben
Zinsen und beim Girokonto steht halt vorne Girokonto und hier steht Soll-Zinsen.
Wenn wir wollten, könnten wir jetzt diese Methode Drucke auch
nach oben ziehen und da auch eine Schablonenmethode machen und dafür einen Schubmethoden nochmal definieren.
Dann machen wir einfach mal. Ich nehme jetzt aus einem
von beiden diese Methode Drucke und schneide sie aus
und packe sie nach oben
in Konto
Und lösche sie aus dem anderen raus, weil die Methode wird
ja jetzt geerbt. Jetzt haben wir natürlich das Problem,
dass bei Girokonto auch Sparbuch und Sollzinsen stehen würden.
Das wäre natürlich blöd. Also gucken wir uns in Konto
mal an, was wir da machen können.
Wir könnten ja eigentlich sagen, wir haben einen Kontotyp,
den wir hier einsetzen. Also machen wir uns mal eine,
ach ja, diese abstrakte Methode brauchen wir hier jetzt
nicht mehr
Weil wir sie ja konkret drin haben.
Deswegen dürfen wir sie hier auch gar nicht mehr haben.
Die löschen wir raus. Jetzt machen wir uns hier
zwei neue, abstrakte Methoden. Diesen Public Upstruct.
Gehen String zurück. Und die eine heißt Get Konto.
Typ. Nimmt nichts entgegen in den Kohlern
Das setzen wir hier jetzt ein. Also hören wir mit den,
Anführungsstrichen, hier auf, machen Plus rein,
wir das Ganze konkortinieren werden, fangen hier wieder mit in Anführungsstrichen.
Also machen wir nochmal ein Pluszeichen. Auf der Seite
fangen hier wieder mit Anführungsstrichen an und schreiben hier,
anstatt Sparbuch, Get Konto.
Typ. Klammer auf, Klammer zu. Und
das Gleiche machen wir hinten auch
Da nennen wir es einfach Get-Sins-Typ, also wieder eine abstrakte Methode,
Public. Abstract. Gibt wieder einen String zurück. Get
, Zins-Typ. Colon ans Ende. Und lassen wieder,
dass wir enden, machen plus,
waren wieder hier am Schluss
Und in Anführungsstrichen hierhin, dass wir wieder einen sauberen String haben.
Und hier schreiben wir Geld. Zimts Job. Genau. Jetzt haben wir
im Prinzip aus der Methode Drucke auch wieder eine Schablonenmethode gemacht,
indem wir hier quasi sowas wie Löcher reingeschnitten haben,
die wir hier mit den einen Schubmethoden füllen.
Jetzt sollte uns eigentlich Sparbuch und Girokonto was anmeckern,
weil Sie implementieren ja die abstrakten Methoden aus der gemeinsamen Oberklasse nicht.
Das bauen wir hier einfach ein, indem wir hier sagen,
Public, String. Get. Komm to Typ.
Komm zu. Und im Rumpf sagen wir dann einfach,
Return. Nur sind wir gerade in Sparbuch,
also Return wäre hier
Sparbuch. Und wir machen hier auch Public.
String. Geht. Zins, Typ. Und im Rumpf
. Wir turnen wir. Weil wir im Sparbuch sind,
wissen wir ja, es sind Haben,
Und das Gleiche machen wir auch im Girokonto.
In der Public. Stringen. Get on to
typ. Return
Und... Public. Stream. Get Zinst-Typ. Tja.
Gut hören wir dann eben, weil wir in einem Girokonto
sind, soll Zinsen. Sind Colon, einmal speichern,
sämtlich Rotenkreuze,
gehen weg
Und wenn wir jetzt das Ganze wieder run ist,
Java-Application machen, dann steht im Prinzip für das Giro-Konto war.
Okay, man merkt, wir hätten hier bei Konto
vielleicht so ein ganz klein bisschen einen Abstand einfügen sollen.
Wahrscheinlich hier hinten auch. Ian Blank, ein Tierenblank,
ist aber eigentlich nur ein kleiner Schönheitsfehler.
Wir lassen es
nochmal laufen
Genau, für das Schirokonto war der. Es sind Sollzinsen
angefangen für das Sparbuch. Es sind Haben-Zinsen eingefallen.
Also steht im Prinzip das Gleiche da wie vorher.
Aber wir haben die Methode Drucke nach oben ziehen können,
indem wir daraus auch wieder einen Schablon-Methode gemacht haben.
Ja, das war es von mir für diese Woche.
Und wir sehen uns dann nächste Woche wieder.
Bis dann