Objektorientierte Programmierung WS 2013/2014 - Lösung 3
Prof. Dr. U. KastensInstitut für Informatik, Fakultät für Elektrotechnik, Informatik und Mathematik, Universität Paderborn
Lösung zu Aufgabe 1
Antworten aus dem Java-Tutorial
http://docs.oracle.com/javase/tutorial/java/generics
zum Thema Generik:
- a)
-
Ist Box<MyInteger> ein Untertyp von Box<MyNumber>?
Nein.
- b)
-
Können auch Funktionen generische Typparameter haben
(ohne dass die umgebende Klasse solche hat)?
Ja, allerdings dürfen sie -wie bei generischen Klassen auch- nicht mit Grundtypen instanziert werden.
- c)
-
Die Java-Klasse
class Try<T> { private T val; public Try() { // constructor val = new T(); } }
lässt sich nicht übersetzen, da es nicht erlaubt ist, Instanzen des generischen Typparameters zu erzeugen:
Lösung zu Aufgabe 2
Die generische Klasse NumberedObject<T>, mit der Objekte von beliebigem Typ T zusammen mit einer automatisch generierten Nummerierung (ab 1 aufsteigend) gespeichert werden:
class NumberedObject<T> { static int count=1; private int numb; private T obj; public NumberedObject(T v) { obj = v; numb=count++; } public String toString() { return numb + ": " + obj; } }
Lösung zu Aufgabe 3
- a)
- Die Beschränkung des Typparameters stellt sicher, dass der Typ, der als Parameter verwendet wird, bestimmte Anforderungen erfüllt. Im vorliegenden Fall muss sichergestellt werden, dass der Typparameter T mit einer Klasse instanziert wird, die eine Methode der Form T add(T t) bereitstellt.
- b)
-
Wir wählen ein Interface, ebenso wäre eine abstrakte Klasse möglich:
interface Adding<T> { T add(T v); }
- c)
-
Die Klasse Preis:
class Preis implements Adding<Preis>{ private int e,c; public Preis(int e, int c) { this.e = e; this.c = c; } public Preis add(Preis p) { Preis res = new Preis(e,c); res.c += p.c; if (res.c >= 100) { res.c -= 100; res.e += p.e + 1; } else res.e += p.e; return res; } public String toString() { return e + "," + c; } }
Lösung zu Aufgabe 4
Zur Vervollständigung mussten nur die Methoden push() und pop() ergänzt werden:
void pop(){ assert(!empty()); --numberofelems; } void push(T *x) { assert(!full()); array[numberofelems++] = x; }
Das vollständige C++ Programm finden Sie in der
Datei stackloes.cc
.
Generiert mit Camelot | Probleme mit Camelot? | Geändert am: 05.12.2013