Lernpfad:Objektorientierte Programmierung mit Java/Generische Typen: Unterschied zwischen den Versionen

keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
Zeile 9: Zeile 9:
Manchmal weiß man bei der Implementierung einer Klasse aber noch nicht, welchen Datentypen alle {{Pfad|Objektvariablen}} haben sollen, oder es ist wünschenswert, eine Klasse so zu implementieren, dass sie verschiedene Datentypen aufnehmen kann (''Datenstrukturen'' sind ein solches Beispiel).
Manchmal weiß man bei der Implementierung einer Klasse aber noch nicht, welchen Datentypen alle {{Pfad|Objektvariablen}} haben sollen, oder es ist wünschenswert, eine Klasse so zu implementieren, dass sie verschiedene Datentypen aufnehmen kann (''Datenstrukturen'' sind ein solches Beispiel).


Um dies zu erlauben gibt es in Java '''Generische Klassen''', die '''Generische Datentypen''' verwenden.  
Um dies zu erlauben, gibt es in Java '''Generische Klassen''', die '''Generische Datentypen''' verwenden.  


''Generische Typen'' werden erst konkret festgelegt, wenn eine {{Pfad|Objekte erstellen|neue Objektinstanz einer Klasse}} erstellt wird. Bei der Implementierung benutzt man noch einen Platzhalter.
''Generische Typen'' werden erst konkret festgelegt, wenn eine {{Pfad|Objekte erstellen|neue Objektinstanz einer Klasse}} erstellt wird. Bei der Implementierung benutzt man noch einen Platzhalter.
Zeile 30: Zeile 30:
</syntaxhighlight>
</syntaxhighlight>


Die Klasse <code>Kiste</code> oben ist eine ''generische Klasse'' mit dem ''generischen Typ'' <code>Inhaltstyp </code>. Er wird durch die Spitzen Klammern (<code><></code>) gekennzeichnet. Der ''generische Typ'' wird wie jeder andere Typ verwendet (zum Beispiel bei der Deklaration der Objektvariablen <code>inhalt</code> oder im entsprechenden Getter und Setter), ohne das es diesen Typ in Java gibt. Möchte man nun ein Objekt der Klasse <code>Kiste</code> erstellen, dann muss man den konkreten Typ des Inhalts mit angeben:
Die Klasse <code>Kiste</code> oben ist eine ''generische Klasse'' mit dem ''generischen Typ'' <code>Inhaltstyp </code>. Er wird durch die spitzen Klammern (<code><></code>) gekennzeichnet. Der ''generische Typ'' wird wie jeder andere Typ verwendet (zum Beispiel bei der Deklaration der Objektvariablen <code>inhalt</code> oder im entsprechenden ''Getter'' und ''Setter''), ohne das es diesen Typ in Java gibt. Möchte man nun ein Objekt der Klasse <code>Kiste</code> erstellen, dann muss man den konkreten Typ des Inhalts mit angeben:
<syntaxhighlight lang="java">
<syntaxhighlight lang="java">
Kiste<String> eineKisteVollText = new Kiste<String>("Hallo, Welt!");
Kiste<String> eineKisteVollText = new Kiste<String>("Hallo, Welt!");
Zeile 82: Zeile 82:


== Darstellung im Klassendiagramm ==
== Darstellung im Klassendiagramm ==
Im [[Implementierungsklassendiagramm]] wird eine ''generische Klasse'' wie andere Klassen dargestellt. Der generische Typparameter wird wie im Quelltext ergänzt und in den Methoden- und Variablen-Signaturen wie gewohnt verwendet.
Im [[Implementierungsklassendiagramm]] wird eine ''generische Klasse'' wie andere Klassen dargestellt. Der generische Typ-Parameter wird wie im Quelltext ergänzt und in den Methoden- und Variablen-Signaturen wie gewohnt verwendet.
[[Datei:Generics_Kiste_1.png|center]]
[[Datei:Generics_Kiste_1.png|center]]


Wird eine generische Klasse von anderen Klassen referenziert, um Daten zu speichern, dann wird der konkrete Inhaltstyp als zusätzliche Notiz an die generische Klasse geschrieben. in der Regel werden dann nicht nochmal alle Objektmethoden der generischen Klasse aufgelistet. Dies ist vor allem für die Modellierung mit [[Datenstrukturen]] relevant.
Wird eine generische Klasse von anderen Klassen referenziert, um Daten zu speichern, dann wird der konkrete Inhaltstyp als zusätzliche Notiz an die generische Klasse geschrieben. In der Regel werden dann nicht erneut alle Objektmethoden der generischen Klasse aufgelistet. Dies ist insbesondere für die Modellierung mit [[Datenstrukturen]] relevant.
[[Datei:Generics_Kiste_2.png|center]]
[[Datei:Generics_Kiste_2.png|center]]


Zeile 94: Zeile 94:
# Implementiere eine Klasse <code>Zoo</code>, die einen Käfig für ''Bienen'' und einen für ''Frösche'' als Objektvariablen enthält. [[Datei:Generics_Zoo_1.png|center]]
# Implementiere eine Klasse <code>Zoo</code>, die einen Käfig für ''Bienen'' und einen für ''Frösche'' als Objektvariablen enthält. [[Datei:Generics_Zoo_1.png|center]]
# Erweitere das Programm nach eigenem Ermessen um folgende Aspekte:
# Erweitere das Programm nach eigenem Ermessen um folgende Aspekte:
#* Ein Käfig kann mehrere Tiere derselben Art aufnehmen. Implementieren sie dies in der Klasse <code>Käfig</code> mit einem ''generischen Array''.
#* Ein Käfig kann mehrere Tiere derselben Art aufnehmen. Implementiere dies in der Klasse <code>Käfig</code> mit einem ''generischen Array''.
#* Ein Zoo kann mehrere Käfige mit derselben Tierart ausstellen. Implementieren sie dies in der Klasse <code>Zoo</code> mit einem Arrays von Käfigen.
#* Ein Zoo kann mehrere Käfige mit derselben Tierart ausstellen. Implementiere dies in der Klasse <code>Zoo</code> mit einem Array von Käfigen.
#* Der Zoo stellt Käfige ähnlicher Tiere (Amphibien, Reptilien, Vögel, Fische, ...) zusammen in Häusern aus (Reptilienhaus, ...). Erstellen sie entsprechende Oberklassen für Tiere und eine generische Klasse ''Tierhaus<Tierklasse>'', die mehrere Käfige von Tieren dieser Oberklasse enthalten.
#* Der Zoo stellt Käfige ähnlicher Tiere (Amphibien, Reptilien, Vögel, Fische, ...) zusammen in Häusern aus (Reptilienhaus, ...). Erstelle entsprechende Oberklassen für Tiere und eine generische Klasse ''Tierhaus<Tierklasse>'', die mehrere Käfige von Tieren dieser Oberklasse enthalten.
{{Aufgabe:End}}
{{Aufgabe:End}}
{{Lösung:Start}}
{{Lösung:Start}}
8.581

Bearbeitungen