TECHNISCHE UNIVERSITÄT MÜNCHEN FAKULTÄT FÜR INFORMATIK Praktikum Grundlagen der Programmierung Aufgabenblatt 7 Robert Eigner, Florian Forster SS 2010 14.06.2010 Abgabe: Eine Woche nach Besprechung im Praktikum. Praktikum Grundlagen der Programmierung Aufgabe 34 (Ü) Mehrfachvererbung Java erlaubt nur Einfachvererbung. Gelegentlich ist für Objekte aber eine Zugehörigkeit zu unterschiedlichen Objektgruppen wünschenswert. Hierzu dienen Schnittstellenbeschreibungen, die in Java interfaces heißen. Klassen können mehrere solcher Schnittstellen implementieren. Die Objekte einer solchen Klasse können dann von Variablen vom Typ einer der implementierten Schnittstellen aufgenommen werden. a) Verschiedene Superhelden verfügen über verschiedene Fähigkeiten. Entwickeln sie ein grafisches Modell, das die Abhängigkeiten zwischen Ober- und Unterklassen klar macht und zusätzlich Interfaces unterscheidet. Wenn Sie UML beherrschen, können Sie Ihr Modell gerne auch als UML-Klassendiagramm notieren. Die Superhelden verfügen über die folgenden unterschiedlichen Fähigkeiten: Conan : kämpfen Superman : kämpfen, fliegen Spiderman : kämpfen, fliegen, denken Chuck Norris : kämpfen, Karate Gemeinsame Eigenschaften mehrerer Gattungen sollen in ihrem Modell in geeignter Weise in gemeinsamen Oberklassen bzw. Schnittstellen (Interfaces) zusammengeführt und dort als Methoden spezifiziert werden. b) Implementieren Sie die Klassen Ihres Modells. Die Methoden sollen nur Textausgaben produzieren. Aufgabe 35 (Ü) verkettete Listen Implementieren Sie eine einfach verkettete Liste für int-Werte, die Werte dürfen dabei mehrmals in der Liste vorkommen Verwenden Sie dazu nicht die von Java bereitgestellten Klassen java.util.LinkedList, java.util.LinkedList<E> oder das Interface java.util.List<E>. Ihre verkettete Liste soll die folgenden Methoden unterstützen: a) boolean isEmpty: testet, ob die gegebene Liste leer ist. b) void insert(int i): fügt ein neues Element am Ende der Liste ein c) void remove(int i): entfernt das erste Element aus der Liste, dessen Wert mit der übergebenen Nummer übereinstimmt. Die Funktion hat keine Wirkung, wenn es ein solches Element nicht gibt. –2– Aufgabe 36 (Ü) Overriding & Overloading Gegeben seien folgende Beispielklassen: class A { public A (){ System . out . println (" Konstruktor A" ); } void test () { System . out . println ("A. test () " ); } } class B extends A { public B () { System . out . println (" Konstruktor B" ); } @Override void test () { System . out . println ("B. test () " ); } } class C extends B { private A a; public C(A a) { System . out . println (" Konstruktor C(A a)" ); this.a = a; } public C () { System . out . println (" Konstruktor C" ); } @Override void test () { System . out . println ("C. test () " ); a. test (); } } class D { void test (A a) { a. test (); System . out . println ("D. test (A a)" ); } void test (B b) { b. test (); System . out . println ("D. test (B b)" ); } } public class LoadAndRideTest { public static void main ( String [] args ) { A a = new A (); A b0 = new B (); a. test (); b0 . test (); System . out . println (" ----------" ); –3– B b1 = new B (); b1 . test (); System . out . println (" ----------" ); C c1 = new C(a ); c1 . test (); System . out . println (" ----------" ); C c2 = new C( b0 ); c2 . test (); System . out . println (" ----------" ); D d = new D (); d. test (a ); d. test ( b0 ); d. test ( b1 ); } } Kompiliert das Programm? Wenn ja, welche Ausgabe erzeugt das Programm? Machen Sie sich den Unterschied zwischen Overloading & Overriding klar und stellen Sie dar, welche Typüberprüfungen zur Laufzeit und welche beim Kompilieren durchgeführt werden. Aufgabe 37 (H) generische verkettete Listen (2 Punkte) Implementieren Sie Aufgabe 35 noch einmal. Verwenden Sie aber diesmal die generische Listejava.util.LinkedList (siehe http://java.sun.com/j2se/1.5.0/docs/api/java/util/ LinkedList.html). Machen Sie sich mit der API dieser Klasse vertraut und verwenden Sie ein Objekt der Klasse LinkedList<Integer>, und freuen Sie sich, dass das nun so wenig Aufwand ist :-) Aufgabe 38 (H) Getränkehändler (16 Punkte) Ein Getränkehändler verfügt über drei Fahrer, die Bestellungen ausliefern. Vormittags nimmt der Händler Bestellungen auf und sortiert sie für seine Fahrer in Listen, die diese dann abzufahren haben. Grundsätzlich sollen die Fahrer die ihnen zugewiesenen Kunden in der Reihenfolge anfahren, in der die Bestellung einging, aber der Händler weist den Kunden – je nach Umsatz – unterschiedliche Prioritäten zu: Falls sie mehr als 200 EUR haben sie die höchste Priorität, zwischen 100 und 200 EUR mittlere Priorität, und unter 100 EUR die niedrigste. a) Implementieren Sie eine geeignete Klassenhierarchie zur Repräsentation von Personen, Fahrern und den unterschiedlichen Kundenklassen. Verwenden Sie Abstraktion, ggf. auch mehrschichtig, indem Sie z. B. eine abstrakte Oberklasse Person einführen, die nur durch ihren Namen identifiziert wird und leiten Sie von dieser Klasse geeignete Unterklassen für die anderen Personengruppen ab. b) Implementieren Sie eine Methode, die das korrekte Einsortieren eines Kunden gemäß seiner Priorität in die Liste eines Fahrers erledigt. Verwenden Sie dazu java.util.LinkedList<E>. c) Die Fahrer werden am Umsatz beteiligt: sollte ihr Gesamtumsatz auf einer Tour unter 1000 EUR liegen, so erhalten sie 10% des Umsatzes, zwischen 1000 und 2000 EUR erhalten sie 20% und über 2000 EUR 30%. Implementieren Sie eine Methode, mit der der Händler die auszuzahlenden Provisionen eines Fahrers berechnen kann. d) Am Ende des Tages möchte der Händler eine Übersicht über die von seinen Fahrern angefahrenen Kunden, deren Umsätze und Provisionen. Implementieren Sie eine Methode, die diese Daten ausgibt. e) Testen Sie Ihre Implementierung ausgiebig mit drei Fahrern, die jeweils 10 Kunden haben. Die Umsätze der Kunden sollen zufällig (z. B. mit der Hilfe von java.util.Random) ermittelt werden.