Als nächstes kommen wir zu dem Thema abstrakte Klassen und Methoden.
Diese, Moment, ich möchte gerne hier einen Kursor haben,
den ich Ihnen gut zeigen kann, der soll rot sein,
hier ist er. Abstrakte Klassen ist unser nächstes Thema,
da sagt der Name ja schon,
dass das was mit Abstraktion zu tun hat, das,
was wir hier wollen, Generalisierung und zusammenfassen.
Dazu haben wir hier die Frage 3 nur, abstrakte Klasse,
was ist das und los geht das mit der Folie 25. Ja,
hier haben wir zunächst erst mal abstrakte Methoden.
Methoden dieser ganzen Sache abstrakte Klassen abstrakte Methoden gibt uns die Möglichkeit,
in die in dem zusammengefassten etwas noch wegzulassen, in dem generalisierten,
was dann in der Spezialisierung weiter unten ergänzt wird.
Wir nehmen das wieder so was mit Klasse,
mit Konto und Sparbuch. Ja, wir nehmen hier etwas,
ob das Konto gedeckt ist für Abhebung eines bestimmten Betrages.
Also ist der Betrag, den wir abheben wollen,
denn auf dem Konto vorhanden. Und wir wollen das so machen,
dass wir hier oben auf der Oberklasse,
in der Superklasse keine Implementierung dazu haben,
weil es fällt uns nichts ein, was da hinkommen könnte.
Nur bei konkreten Bei anderen Klassen, die das brauchen,
bei Vererbten, bei geerbten Klassen bei spezialisierten Klassen,
sollen wir hier ein Quellcode für eben als Implementation angeben.
So, wir dürfen das leer lassen und das ist genau das Konzept der abstrakten Methode.
Die Oberklasse sagt nur, wie die Schnittstelle aussieht,
die deklariert nur die Operation und gibt keine Implementation dazu an.
Ja, so, damit bedeutet das,
wenn wir hier von dieser Klasse jetzt ein Exemplar machen würden,
Das würde gar nicht gehen, da fehlt denn der Quelltext,
wo soll denn der herkommen?
Deswegen darf man von solchen Klassen keine Exemplare machen.
Es ist eine abstrakte Klasse, abstrakte Klassen sind dadurch gekennzeichnet,
dass man, zum einen haben sie solche abstrakten Methoden,
aber sie dürfen auch keine Exemplare haben.
Sie sind, man sieht sie in dem UML-Diagramm,
macht man das so, dass man das Kursivzeichen,
den Namen angibt oder in doppelte Spitzenklammern abstract dran schreibt.
So, in der Unterklasse, in der Subklasse wird dann hier eine Implementation dazugeliefert.
Das heißt, hier wird die Methode erst definiert.
Das ist das Spezielle hierran. Soweit erst mal zu dem Allgemeinen.
Jetzt schauen wir uns das an, wie das im Java-Quelltext aussieht.
Diese abstrakten Klassen, hatte ich schon gerade gesagt,
Schlüssel wird abstrakt, die abstrakten Methoden haben, die Schlüssel wird abstrakt.
Die Klassen haben das Schlüsselwort abstrakt, sie können keine Exemplare bilden,
das ist auch gleich die Antwort auf unsere Frage dazu.
Wir schauen uns das an mit dem Konto, wie wir
es eben gesehen haben, gedeckt, ist nicht implementiert.
Wie sieht das im Quelltext aus? Wir haben die Klasse Konto,
hier gibt es das Schlüsselwort Abstract. Das sagt schon mal jeden,
oh, diese Klasse ist abstrakt, davon kannst du keine Exemplare bilden.
Hier ist diese abstrakte Methode und die macht nicht,
hat nünchen Schlüsselwort, abstract, sondern ist ja auch kein,
sie ist nicht implementiert, sie hat keinen Quelltext.
Also hier wird er normalerweise geschweifte Klammer aufstehen,
geschweifte Klammer zu und dazwischen der eigentliche Body der Methode,
das ist nicht da.
So, und erst in konkreten Implementierungen,
also in einer wirklichen Kontoart, die es dann wirklich gibt,
wie eben Sparbuch oder Girokonto,
da könnten wir
das dann implementieren
Also in der Oberklasse gibt es das nicht,
hier wiederum ohne geschweifte Klammern,
in der Unterklasse gibt es diese Klasse Ist-Betrag gedeckt,
die hat die gleichen Rückgabe, Parameter, Bojen hat den gleichen Parameter Float,
also sie überschreibt das wirklich, aber sie überschreibt es nicht,
weil hier oben gar kein Quelltext da war.
Hier gibt es geschweifte Klammer aufgeschweifte Klammer zu und da wird was drin gemacht.
Dass das ganz wenig ist, stört uns jetzt erstmal nicht,
ich möchte nur hier vor allen Dingen zeigen,
wie sieht das hier tatsächlich aus.
Ja, so und das sollten wir uns dann
auch mal in Eclipse anschauen
Das Schlüssel wird abstrakt, gibt es hier auf der Ebene nicht mehr.
Das heißt, wir haben hier keine abstrakte Klasse mehr von der Klasse.
Sparbuch können wir tatsächlich Exemplare erzeugen. Wir können also konkrete
Sparbücher haben und in einem konkreten Sparbuch können wir dann auch davon,
die wirklich diese Methode aufrufen, ist Betrag gedeckt.
In diesem Beispiel gibt es noch was anderes. Wir haben
hier was Spezielles, nämlich, wir haben die Exemplarvariable Saldo,
haben wir in der Oberklasse als protected deklariert.
Das bedeutet, wir dürfen, wir können hier unten drauf zugreifen.
Wir wissen ja sowieso schon, ja,
es gibt hier Vererbung für die Attribute,
für die Exemplarvariablen und hier unten können wir darauf zugreifen,
weil wir bei der Vererbung diese Exemplarvariable mit geerbt haben.
Die nächste Folie sagt uns das nochmal, dass wir durchaus Operationen deklarieren können,
ohne dass wir die Methoden dazu haben, die Implementation dazu haben.
Es gibt also nur die Schnittstelle und weil es keine Implementation gibt,
gibt es keine Exemplare davon und die Unterklasse muss auch abstrakt deklariert werden, wenn sie nicht alle fehlenden Operationen implementiert.
Also wir können durchaus mehrere abstrakte Operationen,
Klassenhindern übereinander in der Hierarchie haben,
weil wir irgendwie immer noch sagen, ja,
auch in der Unterklasse lassen wir die und die mit Operationen noch abstrakt,
erst in der Halle, in der Klasse,
wo wirklich dann alle Methoden nicht abstrakt sind,
also wirklich eine Implementation haben,
dann können wir,
also wo wir nur konkrete Klassen haben,
da dürfen wir dann
etwas erzeugen
Kleiner Hinweis, diese Definition, dass wir,
oder die Deklaration als abstrakt, das dürfen wir auch durchaus machen,
wenn wir alle Methoden als konkrete Methoden implementiert haben.
Ja, dann verhindern wir immerhin, dass Exemplare abgeleitet werden.
Hier steht nochmal das zusammengefasst, wie das im UEMA ist.
Lass ein Diakram darstellen, mit kursiven Namen,
ist eine abstrakte Klasse, mit gerade geschriebenen Namen,
eine normale Klasse, eine konkrete Klasse.
Und das sieht man natürlich nur, wenn es gedruckt ist,
im Handschriftlichen würde man das nicht sehen.
Da schreibt man mit Spitzenkammern
abstrakt dran
Soweit. Dazu, wie sieht das nun aus mit dem
Aufruf? Wir hatten vorhin dieses Beispiel mit dem Aufruf der
einen Methode durch die anderen. Wir hatten dazu gesagt,
Self-Aufruf, ja, wie sieht denn das jetzt aus?
Darf ich hier oben? Das ist die abstrakte Klasse. Ja,
sie erinnern sich, hatten wir zwei Folien vorher schon mal.
Wir erkennen sie jetzt hier auch daran, dass sie kursiv ist,
wenn man jetzt im Blick dafür schon gewonnen. Ja,
und wenn ich jetzt die Methode Gipsalto habe und hier vielleicht
noch eine Methode Zahle aus, können wir jetzt,
ist Betrag gedeckt aufrufen,
ist ja eine abstrakte Methode
Ja, wir dürfen das. Es gibt kein Problem,
weil so ein Aufruf passiert ja nicht zur Laufzeit.
Das ist erstmal der Compiler,
akzeptiert das, weil es gibt diese Deklaration davon,
zur Laufzeit wird uns auch kein Problem geben,
weil zur Laufzeit gibt es ja mindestens ein Exemplar.
Oder gibt es diese konkrete Klasse und nur von konkreten Klassen gibt es,
wo es alle Methoden, alle Operationen da sind.
Alle Methoden sind konkret. Erst davon gibt es Exemplare und
nur dann gibt es den Aufruf. Also der Fall,
dass ich hier was aufrufe und es gibt gar keinen Body
der Methode
Der passiert nichts, also wir können das garantieren,
es gibt da kein Problem. So, dieses,
dass das Ganze wirklich die Übernahme funktioniert, müssen wir uns auch,
da können wir uns auch daran merken, dass wir sagen,
ja, so was, wir kopieren den Quelltext.
Ja, also das System Java kopiert und übersetzt den Quelltext. Ja,
also wenn das in der Unterklasse redefiniert ist,
das ist ja das Beispiel,
was wir ein bisschen vorher hatten,
ich habe die Operation da unten nochmal definiert,
dann ist klar,
da gibt es
einen Quelltext
Ja, aber wenn sie nicht refinitive definiert ist,
dann übernehmen wir den von oben, wir errben den und
denken uns das so, als wäre er dort übersetzt.
Ja, wir bitte, ich möchte darauf hinweisen,
es ist ein mentales Modell, das heißt, wenn sie wollen, eine Eselsbrücke.
Ja, es wird in den Programmiersprachen nicht wirklich so gemacht.
Ja, Ausnahmen bestätigen die Regeln. Ja,
so und noch um diese ganze Sache noch ein bisschen ins Detail zu bringen,
da wird es noch ein bisschen,
also wenn sie ihnen das schon reicht, schalten sie hier ab.
Wenn man es genauer wissen möchte und wir möchten es vielleicht auch von ihnen genauer wissen,
müssen wir auch noch fragen, wie werden denn die Methoden ausgewertet?
Das heißt, wie werden sie berechnet? Und da ist wieder dieses dynamische Binden,
was wir vorher schon mal gezeigt haben,
was war da vorne schon mal gesagt, war,
wir besuchen immer in der Klasse des aktuellen Objekts, da beginnen wir.
Ich glaube, Folie 18 war das, wo das stand.
Ja, und dann suchen wir in der direkten Oberklasse nach.
So machen wir das. Und die nächste Folie, zeigt
uns das nochmal. Also wenn wir in der Unterklasse,
wenn wir ein Exemplar dieser Klasse haben und suchen hier,
wann hier etwas aufrufen, dann springen wir, suchen wir erst hier.
Und wenn wir da nichts gefunden haben, suchen wir in der Oberklasse
Und damit haben wir die gefunden. Wenn es aber hier
oben so eine Self with of this Referenz gibt,
eine Referenz auf das Objekt ereignen, auf andere Methoden der eigenen Klasse.
Und wir haben das hier unten geerbt, dann würden wir
doch wieder hier von oben nach unten das Ganze verfolgen.
Ja, das wäre die Kombination der Sachen,
die wir vorhin schon mal hatten. Also Jojo heißt nicht,
es geht immer wieder hoch und runter,
sondern wir suchen die Methodensuche, beginnt hier,
springt nach oben, aber für den Fall,
dass wir hier oben dann eine Referenz auf die eigenen Methoden haben und die sind ja unten überschrieben,
dann geht es tatsächlich, wird eine von hier unten genommen.
Ja, also nur bei diesem Selbstaufruf geht es wieder zurück.
Soweit dazu, jetzt muss ich nochmal zurückspringen, habe ich
mir extra notiert, dass wir die Fragen nicht vergessen.
Ich springe mal zurück zur Folie 3, wo die Fragen stand,
da gab es nämlich noch eine Frage mit dem SIS und Super,
nämlich genau dieses ist, was macht denn dieses Super erinnern Sie sich ja häufig,
hoffentlich, das war der Zugriff auf eine Operation einer Superklasse,
einer Oberklasse
Und das This haben wir hier. Wir springen mal
hin und schauen uns die Aufgabe mal an.
Wie sind, wie wirken diese Operatoren This und super?
Wir gehen wieder zurück zu 31. Ja,
also This wäre zum Beispiel, wir haben in der Oberklasse,
wir rufen eine Methode von der eigenen Klasse auf.
Dann können wir den Operator This nehmen. Ja,
wenn wir einen, wenn wir hier unten sind und Operator of Disney,
wird man eine kleine Methode hier von Aufruf.
Wenn wir super nehmen würden, würden wir eine Methode der Superklasse aufrufen.
Das ist das der Wesen dieser beiden, dieser Operatoren.
Soweit und gleich geht es weiter mit der Schablonen-Methode