Aufgabe 6 - Vererbung mit vielen Facetten
Ziel
- Sie können aufzeigen, wie Vererbung für die Anpassung von Fähigkeiten eingesetzt wird.
Auftrag
Ausgangslage
In Kapitel 4 der LU06 wird in Beispiel 6.4 gezeigt, was Überschreiben (overwriting) bewirken soll. Setzen Sie nun dieses Beispiel um. Dazu basieren Sie auf dem Klassendiagramm gemäss Abb 6.2 sowie der Aufgabe 5.
Hinweis:
Diese Aufgabe umfasst viel Wissen und Können, das Sie bisher angewendet haben. Schauen Sie sich notfalls die entsprechenden Ausführungen der Theorie und Übungen an!
Gegeben ist dazu das folgende Klassendiagramm.

Die Methoden der Klasse BankAccount sollen folgende Funktionen ausführen:
is_withdraw_moneyliefert einen angeforderten Geldbetrag, sofern der Saldo (balance) nicht negativ wird. Ist das der Fall, liefert die Methoden False (Geldbezug nicht möglich), sonst True.pay_in_moneyerhöht den Saldo (balance) um den angegebenen Betrag.get_ownerliefert die Referenz auf einCustomer-Objekt.get_balanceliefert den Saldo des Kontos.get_interestliefert den Zinssatz des Kontos.set_interestlegt den Zinssatz fest.get_typeliefert den Typ des Kontos. Dieser Wert wird fix im Konstruktor der jweiligen Klasse - auch der abgeleiteten - festgelegt.printgibt den Namen des Kunden sowie den aktuellen Saldo und den Zinsatz aus.
Die Methoden der Klasse SalaryAccount solllen zusätzlich folgende Funktione ausführen:
is_withdraw_moneyliefert einen angeforderten Geldbetrag, sofern der Saldo (balance) plus der Überzug (overdraw) nicht überschritten werden. Ist das der Fall, liefert die Methoden False (Geldbezug nicht möglich), sonst True. Hier benötigen Sie den Zugriff auf das Attributbalancein der Oberklasse.set_overdrawlegt den möglichen Überzug (Negativsaldo) fest.get_overdrawliefert den möglichen Überzug.printgibt den Namen des Kunden sowie den aktuellen Saldo, den Zinsatz und den Überzug aus.
Bei der Klasse Customer setzen wir nun voll auf die OO-Technik. Wir verwenden nämlich die Klasse Person aus Aufgabe 4 der LU06 als Basis und leiten Sie ab. Daher muss die Klasse Customer nur noch die Methoden zur Verwaltung der Referenzen zu den Konto-Objekten realisieren.
Hinweis: Die Klasse Person ist im Repo bereits vorhanden
get_current_assetsliefert das summierte Vermögen aller Konten.get_number_of_accountsliefert die Anzahl der Konten, die der Kunde aufweist.take_bank_accountliefert die Referenz zu einem Konto, das durch den index angegeben wird. Dabei kann dies eine Referenz aufBancAccountoder aber auchSalaryAccountsein. Bei falschm Index soll eineAccountIndexExceptiongeworfen werden.add_bank_accountfügt eine Referenz für ein Konto zu.printgibt Namen und Jahrgang der Person aus sowie die Angaben zu allen Konti. Dazu wird die print-Methode des Kontos aufgerufen
Vorgehen Teil 1
- Kopieren Sie das Repo von github-classroom.
- Testen Sie die Klasse
Personmit der TestklasseTestPersonintest_person.py. Dieser Test muss fehlerfrei ablaufen, da die KlassePersonja bereits betseht. - Erstellen Sie die Exception-Klasse
AccountIndexException. Die Fehlermeldung soll wie folgt aussehen:
Ungültiger Indexwert: {max} Einträge vorhanden, Nummer {index} gefordert - Erstellen Sie nun die Klasse
Customer. Implementieren Sie die Methoden gemäss der obigen Beschreibung.
Hinweis: Sie können diese Klasse noch nicht testen, da die KlasseBankAccountfehlt. Das werden Sie später aber nachholen.
- Erstellen Sie nun die Klasse
BankAccountgemäss der Beschreibung oben, aber ohnemain-Methode. - Testen Sie die Klasse
BankAccount, bevor Sie diese für die weitere Arbeit nutzen. Dazu verwenden Sie die KlasseTestBankAccountintest_bank_account.py. - Testen Sie nun die Klasse
Customer. Dazu verwenden Sie die TestklasseTestCustomerin der Dateitest_customer.py. - Erstellen Sie die Klasse
SalaryAccountgemäss der Beschreibung oben. - Testen Sie die Klasse. Verwenden Sie dazu die Klasse
TestSalaryaAccountintest_salary_account.py.
Wenn alle Tests fehlerfrei laufen, darf die Annahme getroffen werden, dass der Code die geforderten Spezifikationen erfüllt und die Klassen somit für eine Anwendung genutzt werden können.
Vorgehen Teil 2
- Implementieren Sie die
main-Methode gemäss dem Sequenzdiagramm. - Ergänzen Sie wenn nötig den Konstruktoren von
BancAccountfür die Übergabe der Referenz an die KlasseCustomer. - Den Teil „money draw“ im Diagramm führen Sie zwei Mal aus. Einmal mit einem Bezug von 700 und einmal mit einem Bezug von 400. Hier liefert Ihnen die Methode
withdraw_money()den WertTrue, wenn ein Bezug von Geld möglich ist. Wenn nicht - weil Saldo zu klein - liefert sieFalse. Dem entsprechend soll die Ausgabe am Bildschirm sein. Vergleichen Sie dazu unten den Printscreen.
Erwartetes Ergebnis
Wenn Sie die Klassen gemäss Klassendiagramm und den Ablauf gemäss Sequenzdiagramm implementiert haben, sollten Sie - unter Berücksichtigung einiger erklärender print()-Befehle in main - ein vergleichbares Ergebis erhalten.
Alle gelb markierten stellen werden durch Attribute geliefert bzw. sind im print-Befehl der jeweiligen Klasse zu finden.

Dauer
3-5 Stunden (als Hausaufgabe)


