8.581
Bearbeitungen
Jneug (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
Jneug (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
Zeile 1: | Zeile 1: | ||
{{Navigation}} | {{Navigation}} | ||
''Vererbung'' ist eines der wichtigsten Konzepte der | ''Vererbung'' ist eines der wichtigsten Konzepte der objektorientierten Programmierung. Mit ihr ist es möglich komplexe Problembereiche in sinnvolle Klassenhierarchien zu unterteilen. Dabei werden Eigenschaften und Fähigkeiten, die mehrere Klassen besitzen, nur einmal in einer '''Oberklasse''' implementiert und an eine oder mehrere '''Unterklassen''' weiter ''vererbt''. | ||
== Vererbung im Überblick == | == Vererbung im Überblick == | ||
Zeile 15: | Zeile 15: | ||
Es ergeben sich einige Dopplungen bei Eigenschaften und Methoden. Jede Klasse besitzt x- und y-Koordinaten und eine Richtung als Attribut, sowie die Methoden <code>versetzen</code> und <code>drehen</code>. Diese müssten bei der Implementierung jeweils exakt gleich umgesetzt werden, was neben viel Aufwand sehr fehleranfällig ist. | Es ergeben sich einige Dopplungen bei Eigenschaften und Methoden. Jede Klasse besitzt x- und y-Koordinaten und eine Richtung als Attribut, sowie die Methoden <code>versetzen</code> und <code>drehen</code>. Diese müssten bei der Implementierung jeweils exakt gleich umgesetzt werden, was neben viel Aufwand sehr fehleranfällig ist. | ||
Stattdessen können im Problembereich logische Zusammenhänge zwischen den Klassen identifiziert werden. Jede Klasse ''ist eine'' <code>Form</code>. Ein <code>Quadrat</code> ''ist ein'' <code>Rechteck</code>. Die konkreten Form-Klassen haben alle bestimmte Attribute und Methoden gemeinsam. | |||
<code>Form</code> ist also eine '''Oberklasse''' von <code>Dreieck</code> und <code>Rechteck</code>. <code>Quadrat</code> ist eine '''Unterklasse''' von <code>Rechteck</code>. (Also ist <code>Rechteck</code> wiederum '''Oberklasse''' von <code>Quadrat</code>.) Die Methoden müssen so nur einmal in <code>Form</code> implementiert werden, sind aber durch die Vererbung in allen Objektinstanzen verfügbar. | <code>Form</code> ist also eine '''Oberklasse''' von <code>Dreieck</code> und <code>Rechteck</code>. <code>Quadrat</code> ist eine '''Unterklasse''' von <code>Rechteck</code>. (Also ist <code>Rechteck</code> wiederum '''Oberklasse''' von <code>Quadrat</code>.) Die Methoden müssen so nur einmal in <code>Form</code> implementiert werden, sind aber durch die Vererbung in allen Objektinstanzen verfügbar. | ||
Zeile 29: | Zeile 29: | ||
{{Aufgabe:Start}} | {{Aufgabe:Start}} | ||
# Folgende Begriffe sollen in Form eines Klassendiagramms in eine Klassenhierarchie umgesetzt werden: ''Gebäude - Kirche - Einfamilienhaus - Hochhaus - Haus - Bungalow - Dom - Kathedrale''.<br/>Von jedem Gebäude soll die Höhe und die zugelassene Anzahl Bewohner bzw. Besucher abrufbar sein. Die Höhe von Häusern berechnet sich aus der Anzahl der Stockwerke und der Höhe pro Stockwerk. In einem | # Folgende Begriffe sollen in Form eines Klassendiagramms in eine Klassenhierarchie umgesetzt werden: ''Gebäude - Kirche - Einfamilienhaus - Hochhaus - Haus - Bungalow - Dom - Kathedrale''.<br/>Von jedem Gebäude soll die Höhe und die zugelassene Anzahl Bewohner bzw. Besucher abrufbar sein. Die Höhe von Häusern berechnet sich aus der Anzahl der Stockwerke und der Höhe pro Stockwerk. In einem Hochhaus sind pro Stockwerk eine Anzahl Personen zugelassen.<br/>Wähle zu diesem Zweck geeignete Attribute für die einzelnen Klassen. Beachte dabei, welche Attribute von der bzw. den Oberklasse(n) geerbt werden. | ||
# Implementiere die Klassen. | # Implementiere die Klassen. Nutze dazu das Vererbungskonzept so weit es geht aus. | ||
{{Aufgabe:End}} | {{Aufgabe:End}} | ||
Zeile 47: | Zeile 47: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Hat die Oberklasse ''keinen leeren Konstruktor'' (also keinen Konstruktor ohne Parameter), dann muss die Unterklasse noch den Konstruktor der Oberklasse | Hat die Oberklasse ''keinen leeren Konstruktor'' (also keinen Konstruktor ohne Parameter), dann muss die Unterklasse noch den Konstruktor der Oberklasse mithilfe des Schlüsselwortes <code>super</code> ''explizit aufrufen'', um die Parameter zu initialisieren. Dies muss die erste Anweisung im Konstruktor der Unterklasse sein. | ||
<syntaxhighlight lang="java" line=1 highlight="11"> | <syntaxhighlight lang="java" line=1 highlight="11"> | ||
public class Form { | public class Form { | ||
Zeile 116: | Zeile 116: | ||
{{Aufgabe:Start}} | {{Aufgabe:Start}} | ||
# Lies den [http://openbook.rheinwerk-verlag.de/javainsel/06_004.html#u6.4.1 "Abschnitt 6.4.1: Methoden in Unterklassen mit neuem Verhalten ausstatten"] im Onlinebuch "Java ist auch eine Insel" bis zur Überschrift "Die Annotation @Override". | # Lies den [http://openbook.rheinwerk-verlag.de/javainsel/06_004.html#u6.4.1 "Abschnitt 6.4.1: Methoden in Unterklassen mit neuem Verhalten ausstatten"] im Onlinebuch "Java ist auch eine Insel" bis zur Überschrift "Die Annotation @Override". | ||
# | # Erstelle ein kleines Beispielprojekt, an dem das Konzept "Überschreiben" erklärt werden kann. | ||
{{Aufgabe:End}} | {{Aufgabe:End}} | ||
=== Quiz === | === Quiz === | ||
Zeile 129: | Zeile 129: | ||
== <code>super</code> und <code>this</code> == | == <code>super</code> und <code>this</code> == | ||
Wird eine Methode von einer Unterklasse überschrieben möchte man dennoch manchmal explizit die überschriebene Methode der Oberklasse aufrufen. Für diese Fälle gibt es das bekannte Schlüsselwort <code>super</code>. Es bezieht sich immer auf ''die Oberklasse der aktuellen Klasse''. Um ''explizit die aktuelle Klasse'' zu referenzieren, kann das Schlüsselwort <code>this</code> benutzt werden. | Wird eine Methode von einer Unterklasse überschrieben, möchte man dennoch manchmal explizit die überschriebene Methode der Oberklasse aufrufen. Für diese Fälle gibt es das bekannte Schlüsselwort <code>super</code>. Es bezieht sich immer auf ''die Oberklasse der aktuellen Klasse''. Um ''explizit die aktuelle Klasse'' zu referenzieren, kann das Schlüsselwort <code>this</code> benutzt werden. | ||
Im folgenden Beispiel überschriebt die Klasse <code>Hund</code> die Methode <code>public void ausgabe()</code> er Oberklasse <code>Tier</code>, um auch die Rasse auszugeben. Die Ausgabe der Oberklasse soll dennoch gemacht werden, daher wird die Methode der Oberklasse explizit mit <code>super.ausgabe()</code> aufgerufen. | Im folgenden Beispiel überschriebt die Klasse <code>Hund</code> die Methode <code>public void ausgabe()</code> er Oberklasse <code>Tier</code>, um auch die Rasse auszugeben. Die Ausgabe der Oberklasse soll dennoch gemacht werden, daher wird die Methode der Oberklasse explizit mit <code>super.ausgabe()</code> aufgerufen. |
Bearbeitungen