Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
faecher:informatik:oberstufe:modellierung:vererbung:polymorphismus:start [29.11.2021 19:50] – sbel | faecher:informatik:oberstufe:modellierung:vererbung:polymorphismus:start [19.03.2024 09:15] (aktuell) – [Lösungsansatz: Überschreiben] Frank Schiebel | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ====== | + | ====== |
- | ===== Variablenpolymorphismus | + | ===== Problemstellung |
- | **Polymorphismus** haben wir schon für Variablen kennengelernt: Eine Variable eines Supertyps kann auch Werte aller Subtypen halten - die Variable ist // | + | Die Vererbungshierarchie unseres soziales Netzwerk mit Vererbung sieht gerade so aus: |
- | {{ : | ||
+ | {{ : | ||
- | ---- | + | Man sieht, dass die Methode zum Anzeigen eines Beitrags in der Klasse '' |
- | {{:aufgabe.png? | + | |
- | === (A1) === | + | |
- | Welche Typen können Werte haben, die in den folgenden Variablen gespeichert werden? | + | {{ : |
- | < | + | |
- | Fahrzeug f; | + | |
- | Roller r; | + | |
- | vierRaedrig v; | + | |
- | </ | + | |
- | ===== Methodenpolymorphismus ===== | + | dabei werden die Besonderheiten der Beitragsarten nicht berücksichtigt - der '' |
- | ==== Problemstellung ==== | + | {{ : |
+ | Die spontane Lösungsidee verschiebt die '' | ||
- | Die Vererbungshierarchie unseres soziales Netzwerk mit Vererbung sieht gerade so aus: | + | {{ :faecher: |
+ | **Dieser Versuch ist zum Scheitern verurteilt: | ||
- | {{ : | + | * Zugriff auf die privaten geeerbten Attribute aus Beitrag ist nicht möglich. |
+ | * Die Klasse '' | ||
- | Man sieht, dass die Methode zum Anzeigen eines Beitrags in der Klasse '' | ||
- | {{ :faecher: | + | ===== Lösungsansatz: Überschreiben ===== |
- | dabei werden die Besonderheiten | + | * Superklasse und Subklasse definieren |
+ | * Jede der Methoden | ||
+ | * Der Check des statischen Typs der Superklasse ist erfüllt. | ||
+ | * Die Methode der Subklasse wird erst zur Laufzeit aufgerufen | ||
- | {{ :faecher: | + | Es gibt also '' |
+ | {{ : | ||
+ | |||
+ | Fragen: | ||
+ | * Welche Rolle spielt die Version der Superklasse? | ||
+ | * Welche der '' | ||
+ | |||
+ | |||
+ | ===== Methodenauswahl zur Laufzeit ===== | ||
+ | |||
+ | ==== Ohne Vererbung ==== | ||
+ | |||
+ | Keine Vererbung, kein Polymorphismus, | ||
+ | |||
+ | <code java> | ||
+ | v1.display() | ||
+ | </ | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | ==== Vererbung, kein Überschreiben ==== | ||
+ | |||
+ | <code java> | ||
+ | v1.display() | ||
+ | </ | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Bei der Suche nach der Methode wird die Vererbungshierarchie von unten nach oben durchlaufen (beginnend beim dynamischen Typ), bis zum Treffer – diese Methode wird ausgeführt. | ||
+ | |||
+ | <WRAP center round box 90%> | ||
+ | Die Methode der Superklasse wird also solange von den Versionen der Subklasse(n) „verdeckt“, | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ==== Vererbung und Überschreiben: | ||
+ | |||
+ | <code java> | ||
+ | v1.display() | ||
+ | </ | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Bei der Suche nach der auszuführenden Methode wird die Vererbungshierarchie von unten nach oben durchlaufen (beginnend beim dynamischen Typ), **bis der erste Treffer gefunden wird** – diese Methode wird ausgeführt. Im Beispiel also die Methode, die in '' | ||
+ | |||
+ | ==== Methodenwahl: | ||
+ | |||
+ | - Auf die Variable wird zugegriffen | ||
+ | - Das in der Variable gespeicherte Objekt wird aufgesucht | ||
+ | - Die Klasse des Objekts wird bestimmt | ||
+ | - Implementiert die Klasse die gesuchte Methode? | ||
+ | - Wenn nicht, wird die Superklasse untersucht. | ||
+ | - Schritte 4) und 5) werden solange wiederholt, bis die Methode gefunden wurde oder die Klassenhierarchie bis ganz nach oben durchlaufen wurde. | ||
+ | - Die überschriebenen Methoden verdecken dabei stets die von der Superklasse geerbten Versionen. | ||
+ | |||
+ | |||
+ | ===== Alle Klassen erben von " | ||
+ | |||
+ | Jede Klasse erbt von Java Object, das kann man beispielsweise erkennen, wenn man einfach mal eine " | ||
+ | |||
+ | <code java> | ||
+ | class Ball () { | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | |||
+ | Man kann diesen Ball instanziieren, | ||
+ | |||
+ | <code java> | ||
+ | Hund ball01 = new Ball(); | ||
+ | </ | ||
+ | |||
+ | Er hat sogar schon Methoden, z.B. die Methode '' | ||
+ | |||
+ | <code java> | ||
+ | ball01.toString(); | ||
+ | </ | ||
+ | |||
+ | das Erzeugt eine Ausgabe der folgenden Form: | ||
+ | |||
+ | < | ||
+ | ball01@af54f432 | ||
+ | </ | ||
+ | https:// | ||
===== Material ===== | ===== Material ===== | ||
{{simplefilelist>: | {{simplefilelist>: |