Benutzer-Werkzeuge

Webseiten-Werkzeuge


anhang:generics:start

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Nächste Überarbeitung
Vorhergehende Überarbeitung
anhang:generics:start [2024/12/06 07:56] – angelegt Martin Pabstanhang:generics:start [2024/12/13 08:28] (aktuell) – [Aufgabe] Martin Pabst
Zeile 1: Zeile 1:
 ====== Generische Klassen ====== ====== Generische Klassen ======
-<WRAP center round info 80%>+===== Problemstellung ===== 
 +<WRAP center round tip 80%>
 Stellen Sie sich eine Klasse ''Liste'' vor, die beliebige Objekte speichern kann und beispielsweise Methoden ''add'' (hinten hinzufügen) und ''getFirst'' (erstes Element zürückliefern) besitzt:  Stellen Sie sich eine Klasse ''Liste'' vor, die beliebige Objekte speichern kann und beispielsweise Methoden ''add'' (hinten hinzufügen) und ''getFirst'' (erstes Element zürückliefern) besitzt: 
 <code java> <code java>
Zeile 8: Zeile 9:
 } }
 </code> </code>
-Die Klasse ''Object'' ist Oberklasse **aller** Klassen in Java. Damit die Liste beliebige Objekte speichern kann, muss der Parameter von ''add'' vom Typ ''Object'' sein, ebenso der Rückgabe-Datentyp von ''getFirst''. Das ist aber ungünstig: Instanziert man beispielsweise eine Liste ''Liste kundenliste'' zum Speichern von Objekten der Klasse ''Kunde'', so wünscht man sich, dass ''kundenliste.add'' nur Objekte der Klasse ''Kunde'' akzeptiert. Außerdem möchte man beispielsweise schreiben können+Die Klasse ''Object'' ist Oberklasse **aller** Klassen in Java. Damit die Liste beliebige Objekte speichern kann, muss der Parameter von ''add'' vom Typ ''Object'' sein, ebenso der Rückgabe-Datentyp von ''getFirst''\\  
 +Das ist aber **ungünstig**Stellen Sie sich vor, Sie instanzieren eine Liste zum Speichern von ''Kunde''-Objekten: 
 +<code java> 
 +Liste kundenliste = new Liste(); 
 +</code> 
 +Sie würden sich wünschen, dass ''kundenliste.add'' nur Objekte der Klasse ''Kunde'' akzeptiert, damit Ihnen beim Programmieren kein Fehler unterlaufen kann. Außerdem möchten Sie beispielsweise schreiben können
 <code java> <code java>
 Kunde k = kundenliste.getFirst(); Kunde k = kundenliste.getFirst();
 </code> </code>
-Der Compiler meldet in diesem Fall einen Fehler, da er nicht weiß, dass in die ''kundenliste'' nur Objekte der Klasse ''Kunde'' gesteckt werden und ''kundenliste.getFirst()'' somit auch nur solche zurückliefern wird.+Der Compiler meldet in diesem Fall aber einen Fehler, da er nicht weiß, dass in die ''kundenliste'' nur Objekte der Klasse ''Kunde'' gesteckt werden und ''kundenliste.getFirst()'' somit auch nur solche zurückliefern wird. \\ \\  
 +Wir brauchen eine Möglichkeit, den Compiler **beim Instanzieren der Liste** darüber zu informieren, dass darin später nur Objekte der Klasse ''Kunde'' (und natürlich von Unterklassen davon) gespeichert werden sollen. 
 +</WRAP> 
 + 
 +===== Generics ===== 
 +<WRAP center round info 80%> 
 +Viele Programmiersprachen bieten Möglichkeiten der [[https://en.wikipedia.org/wiki/Generic_programming|Generischen Programmierung]], d.h. Sie ermöglichen beispielsweise die Deklaration einer Klasse unter Zuhilfenahme eines allgemeinen Datentypen (z.B. ''T''), der erst beim Instanzieren festgelegt wird. In Java sieht das so aus: 
 +<code java> 
 +class Liste<T>
 +   T anfang; 
 +   void add(T element){ ... } 
 +   T getFirst(){ ... } 
 +
 +</code> 
 +Eine Liste zum Speichern von ''Kunde''-Objekten instanziert man dann so: 
 +<code java> 
 +Liste<Kunde> kundenliste = new Liste<Kunde>(); 
 +// Wegen Type-inference geht auch: List<Kunde> kundenliste = new Liste<>(); 
 +</code> 
 +Jetzt ist alles wie gewünscht: ''kundenliste.add'' akzeptiert nur Objekte der Klasse ''Kunde'' (und Unterklassen) und 
 +<code java> 
 +Kunde k = kundenliste.getFirst(); 
 +</code> 
 +liefert keinen Fehler mehr. 
 +</WRAP> 
 + 
 +===== Aufgabe ===== 
 +<WRAP center round todo 80%> 
 +a) Schreiben Sie eine generische Klasse ''Liste'' unter Zuhilfenahme des Entwurfsmusters Kompositum, die mindestens folgende Methoden hat: 
 +  * ''T pop()'' (erstes Element entnehmen) 
 +  * ''push(T element)''(Element hinten anfügen) 
 +  * ''int size()'' (Anzahl der enthaltenen Elemente) 
 +  * ''void clear()'' (Liste leeren) 
 +  * ''void addFirst(T element)'' (vorne anfügen) 
 +  * ''T getLast()'' (letztes Element entnehmen) 
 + 
 +b) Schreiben Sie für jede der Methoden oben mindestens einen automatisierten [[anhang:unittests:start|Unit Test.]]
 </WRAP> </WRAP>
 +
 +[[.generics:loesung:start|Lösung]]
 +
 +===== Bounded type parameters =====
 +
 +
 +
  
anhang/generics/start.1733471807.txt.gz · Zuletzt geändert: 2024/12/06 07:56 von Martin Pabst

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki