SS 2001 Übungen zu Softwareentwicklung 2 Übung 2 Name: ___________________________________________Tutor: _______________ Matrikelnummer: __________________________________ Punkte: _______________ Übungsleiter / Gruppe: ______________________________ Abgabe: 1. Aufgabe: Mitarbeiter-Datenbank 22.3.2001, 8.15 Uhr (13 Punkte) Bei dieser Aufgabe soll eine dynamische Liste implementiert werden, die alle Mitarbeiter einer kleinen Firma enthalten soll. Diese Firma besitzt jedoch drei verschiedene Klassen von Mitarbeitern, wobei für jede Klasse das Gehalt unterschiedlich berechnet wird. Alle verschiedenen Mitarbeiterklassen müssen jedoch von einer gemeinsamen Basisklasse Employee abgeleitet werden, die wie folgt aufgebaut ist: public abstract class Employee { private String fName; private String lName; public Employee next; // Constructor public Employee( String first, String last ){ fName = new String ( first ); lName = new String( last ); } // Return a copy of the first name public String getFirstName(){ return new String( fName ); } // Return a copy of the last name public String getLastName(){ return new String( lName ); } abstract double earnings(); // returns true if Employee e is the same as this public boolean equals(Employee e){ return fName.equals(e.getFirstName()) && lName.equals(e.getLastName()); } } Von dieser Basisklasse sollen nun die einzelnen Mitarbeiterklassen abgeleitet werden: • Klasse ComissionWorker : Bei dieser Klasse von Mitarbeitern berechnet sich das Gehalt aus einem monatlichen Grundgehalt und einem Kommissionswert pro verkauften Stück. • Klasse HourlyWorker: Bei dieser Klasse von Mitarbeitern berechnet sich das Gehalt aus einem Stundenlohn multipliziert mit der Anzahl der gearbeiteten Monatsstunden. • Klasse PieceWorker: Bei dieser Klasse berechnet sich das Gehalt aus der Summe der erzeugten Stücke multipliziert mit einem Stückwert. • Klasse Boss: Bei dieser Klasse, der nur ein Mitarbeiter angehört, berechnet sich das Gehalt einfach durch ein monatliches Fixgehalt. Die für die Gehaltsberechnung benötigten Daten, zum Beispiel der Stückwert sollen als Konstanten in den jeweiligen Klassen implementiert werden. Die Verwaltung dieser dynamischen Liste erfolgt durch die Klasse Database, die mindestens folgende Funktionalität unterstützen sollte: • Beliebige Mitarbeiter in die Datenbank einfügen oder löschen (Achtung beim mehrmaligem Einfügen der gleichen Person soll diese Person nur einmal in der Datenbank enthalten sein!) . • Ein Iterator, der mit Hilfe der Funktionen getFirst() und getNext() die Liste der Mitarbeiter durchlaufen kann. • Ausgeben einer Liste aller Mitarbeiter in der Datenbank mit ihren Gehältern pro Monat. • Nach einem bestimmten Mitarbeiter suchen. Tip: Versuchen Sie die Vorteile der objektorientierten Programmierung so zu nützen, dass Ihre Klassen eine möglichst elegante und einfache Struktur besitzen und deren Funktionen ebenfalls von den objektorientierten Prinzipien profitieren. Testen Sie Ihre Klasse Database ausführlich anhand einer eigenen Klasse Test, wobei sie die einzelnen Stückwerte und Kommissionen selbst festlegen können. 2. Aufgabe: Dynamische Bindung (4 Punkte) Welche Ausgabe erzeugt folgendes Programm auf der Konsole, begründen Sie ihre Angaben ausführlich. class Base{ Base(){ System.out.println(„Base Constructor“); print(); } public void print(){ System.out.println(„Print Base“); } } class Derived extends B ase{ Derived(){ System.out.println(“Derived Constructor”); } public void print(){ System.out.println(„Print Derived“); } public static void main(String argv[]){ Derived d = new Derived(); } } 3. Aufgabe: Theoriefragen (1 + 2 + 2 +2 Punkte) a. Was ist, bzw. was bewirkt ein Supercall? b. Wie würden sie Vererbung beschreiben, was bedeutet es? c. Erklären Sie die Unterschiede zwischen statischer und dynamischer Bindung. d. Warum muss der dynamische Typ zur Laufzeit in jedem Objekt gespeichert werden?