Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Nächste Überarbeitung
Vorhergehende Überarbeitung
modul:m320_2024:learningunits:lu10:aufgaben:vererbung [2024/10/28 07:22] – angelegt msutermodul:m320_2024:learningunits:lu10:aufgaben:vererbung [2024/10/28 09:22] (aktuell) msuter
Zeile 3: Zeile 3:
 Setzen Sie verschiedene Facetten der Vererbung in einer Applikation ein. Setzen Sie verschiedene Facetten der Vererbung in einer Applikation ein.
 </WRAP> </WRAP>
- +==== Hinweise ====
-===== Auftrag ===== +
-==== Hinweis ====+
 Diese Aufgabe umfasst viel Wissen und Können, das Sie bisher angewendet haben.  Diese Aufgabe umfasst viel Wissen und Können, das Sie bisher angewendet haben. 
 Schauen Sie sich die entsprechenden Ausführungen der Theorie und Übungen an! Schauen Sie sich die entsprechenden Ausführungen der Theorie und Übungen an!
 +===== Auftrag =====
 +
 +
 +Die Ausgaben in den Beschreibungen sind als Beispiele zu verstehen.
 +
 ==== Ausgangslage ==== ==== Ausgangslage ====
-In [[.:modul/m320_2024/learningunits/lu10/unterklasse]] wird gezeigt, was Überschreiben (overwriting) bewirken soll.  +In [[:modul/m320_2024/learningunits/lu10/unterklasse]] wird gezeigt, was Überschreiben (overwriting) bewirken soll.  
-Die Aufgabenstellung basiert auf dem [[.:modul/m320_2024/learningunits/lu10/grundlagen#beispiel_bankaccount|Beispiel "BankAccount"]].+Die Aufgabenstellung basiert auf dem [[:modul/m320_2024/learningunits/lu10/grundlagen#beispiel_bankaccount|Beispiel "BankAccount"]].
  
 Gegeben ist dazu das folgende Klassendiagramm. Gegeben ist dazu das folgende Klassendiagramm.
  
-{{:modul:m320:learningunits:lu06:aufgaben:lu06-aufg6_ueberschreiben-1.png?900|}}+{{:modul:m320_2024:learningunits:lu10:aufgaben:bankaccount_class.png?600|}}
  
-Die Methoden der Klasse ''BankAccount'' sollen folgende Funktionen ausführen: +===== Vorgehen Teil 1 ===== 
-  * ''is_withdraw_money'' liefert einen angeforderten Geldbetrag, sofern der Saldo (''balance'') nicht negativ wirdIst das der Fallliefert die Methoden False (Geldbezug nicht möglich), sonst True. + 
-  * ''pay_in_money'' erhöht den Saldo (''balance'') um den angegebenen Betrag+==== Schritt 1 ==== 
-  * ''get_owner'' liefert die Referenz auf ein ''Customer''-Objekt. +Akzeptieren Sie das Assignment im GitHub Classroom. 
-  * ''get_balance'' liefert den Saldo des Kontos+ 
-  * ''get_interest'' liefert den Zinssatz des Kontos. +Testen Sie die Klasse ''Person'' mit der Testklasse ''TestPerson'' in ''test_person.py''Dieser Test muss fehlerfrei ablaufenda die Klasse ''Person'' ja bereits besteht
-  * ''set_interest'' legt den Zinssatz fest+ 
-  * ''get_type'' liefert den Typ des Kontos. Dieser Wert wird fix im Konstruktor der jweiligen Klasse - auch der abgeleiteten - festgelegt. +===== Schritt 2 ===== 
-  * ''print'' gibt den Namen des Kunden sowie den aktuellen Saldo und den Zinsatz aus. +Erstellen Sie die Exception-Klasse ''AccountIndexException'' 
-Die Methoden der Klasse ''SalaryAccount'' solllen zusätzlich folgende Funktione ausführen+ 
-  * ''is_withdraw_money'' liefert einen angeforderten Geldbetragsofern 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 Attribut ''balance'' in der Oberklasse+Die Exception erwartet zwei Parameter: 
-  * ''set_overdraw'' legt den möglichen Überzug (Negativsaldo) fest+  * Die Anzahl Konten des Kunden ''max''
-  ''get_overdraw'' liefert den möglichen Überzug. +  * Den Index des Kontos, das gelesen/gelöscht werden sollte ''index'' 
-  * ''print'' gibt den Namen des Kunden sowie den aktuellen Saldoden Zinsatz und den Überzug aus. +Die Fehlermeldung soll wie folgt aussehen:  
-\\ +<code>Ungültiger Indexwert: {max} Einträge vorhandenNummer {index} gefordert</code> 
-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//\\ +Um die Exception zu testenkönnen Sie ein einfaches Skript am Ende der Datei einfügen, z.B.
-  * ''get_current_assets'' liefert das summierte Vermögen aller Konten+ 
-  * ''get_number_of_accounts'' liefert die Anzahl der Konten, die der Kunde aufweist. +<code python> 
-  * ''take_bank_account'' liefert die Referenz zu einem Konto, das durch den index angegeben wird. Dabei kann dies eine Referenz auf ''BancAccount'' oder aber auch ''SalaryAccount'' sein. Bei falschm Index soll eine ''AccountIndexException'' geworfen werden.+..
 +if __name__ == '__main__'': 
 +    raise AccountIndexException(59) 
 +</code> 
 + 
 +==== Schritt 3 ==== 
 +Erstellen Sie nun die Klasse ''Customer'' und implementieren die Methoden gemäss der Beschreibung.  
 +Debei setzen wir nun voll auf die OO-Technik.  
 +Wir verwenden nämlich die Klasse ''Person'' aus einer früheren Aufgabe als Basis und leiten Sie ab.  
 +Daher muss die Klasse ''Customer'' nur noch die Methoden zur Verwaltung der Referenzen zu den Konto-Objekten realisieren. 
 + 
 +  * ''current_assets'' liefert das summierte Vermögen aller Konten.
   * ''add_bank_account'' fügt eine Referenz für ein Konto zu.   * ''add_bank_account'' fügt eine Referenz für ein Konto zu.
-  * ''print'' gibt Namen und Jahrgang der Person aus sowie die Angaben zu allen KontiDazu wird die print-Methode des Kontos aufgerufen+  * ''take_bank_account'' liefert die Referenz zu einem Konto, das durch den index angegeben wird. Dabei kann dies eine Referenz auf ''BancAccount'' oder aber auch ''SalaryAccount'' sein. Bei falschem Index soll eine ''AccountIndexException'' geworfen werden. 
 +  * ''__str__'' Gibt die Angaben zum Kunden und seiner Konti aus. 
 +    * Die Angaben des Kunden werden aus der ''__str__''-Methode der Klasse ''Person'' geholt. 
 +    * Die Angaben zu einem Konto holen wir uns über die ''__str__''-Methode der Klasse ''Account''
 + 
 +<code> 
 +Kunde    : Pia 
 +Kontotyp : Standard bank account 
 + Saldo: 1000.0 
 + Zins : 1.5 
 +</code> 
 + 
 +=== Hinweise === 
 +  * Die Klasse ''Person'' ist im Repo bereits vorhanden. 
 +  * Sie können diese Klasse bisher nur teilweise testen, da die Klasse ''BankAccount'' fehlt. Das werden Sie später aber nachholen. 
 + 
 +==== Schritt 4 ==== 
 +Erstellen Sie nun die Klasse ''BankAccount'' und implementieren die Methoden gemäss der Beschreibung. 
 +  * Im Konstruktor muss die Methode ''add_bank_account'' beim Kunden aufgerufen werden. 
 +  * ''has_available'' prüft ob der angeforderte Betrag kleiner oder gleich dem Saldo (''balance'') ist. 
 +  * ''withdraw_money'' reduziert den Saldo (''balance'') um den angegebenen Betrag, sofern dies möglich ist. 
 +    * Nutzen Sie die Methode ''has_available'' um zu prüfen, ob der Saldo gross genug ist. 
 +    * Der Returnwert ist der geforderte Betrag oder 0, falls der Bezug nicht möglich war. 
 +  * ''deposit_money'' erhöht den Saldo (''balance'') um den angegebenen Betrag. 
 +  * ''__str__'' gibt den Namen des Kunden sowie den aktuellen Saldo und den Zinsatz zurück. 
 + 
 +Testen Sie die Klasse ''BankAccount'', bevor Sie diese für die weitere Arbeit nutzen. Dazu verwenden Sie die Tests in ''test_bank_account.py''
 + 
 +==== Schritt 5 ==== 
 +Erstellen Sie nun die Klasse ''SalaryAccount'' und implementieren die Methoden gemäss der Beschreibung. 
 +  * ''overdraft'' enthält den maximal zulässigen Überzug. 
 +  * ''has_available'' prüft ob der angeforderte Betrag kleiner oder gleich dem verfügbaren Betrag (''balance + overdraft'' ) ist. 
 +  * ''__str__'' gibt den Namen des Kunden, den aktuellen Saldo, den maximalen Überzug und den Zinsatz zurück. 
 + 
 +<code> 
 +Kunde    : Pia 
 +Kontotyp : Salary bank account 
 + Saldo: 5000.0 
 + Zins : 2.25 
 + Überzug: 2500.0 
 +</code> 
 + 
 +Testen Sie die Klasse ''SalaryAccount'' mit den Tests in ''test_salary_account.py''
 + 
 +===== Vorgehen Teil 2 ===== 
 +Implementieren Sie die ''main''-Methode in ''main.py'' gemäss dem Sequenzdiagramm. 
 + 
 +{{:modul:m320_2024:learningunits:lu10:aufgaben:bankaccount_sequence.png?600|}} 
 + 
 +  * Ergänzen Sie wenn nötig den Konstruktor von ''BankAccount'' für die Übergabe der Referenz an die Klasse ''Customer''
 +  * Den Teil "money draw" im Diagramm führen Sie zwei Mal aus.  
 +    * Einmal mit einem Bezug von 700  
 +    * Einmal mit einem Bezug von 400.  
 +Hier liefert Ihnen die Methode ''withdraw_money()'' den Wert ''True'', wenn ein Bezug von Geld möglich ist. Wenn nicht - weil Saldo zu klein - liefert sie ''False''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.
  
-===== Schritt 1 ===== +<code> 
-  - Akzeptieren Sie das Assignment im GitHub Classroom. +Angaben zu Kunde 
-  - Testen Sie die Klasse ''Person'' mit der Testklasse ''TestPerson'' in ''test_person.py''. Dieser Test muss fehlerfrei ablaufen, da die Klasse ''Person'' ja bereits besteht. + NamePia 
-  - Erstellen Sie die Exception-Klasse ''AccountIndexException''. Die Fehlermeldung soll wie folgt aussehen\\ ''Ungültiger Indexwert: {max} Einträge vorhanden, Nummer {index} gefordert'' + Alter23 
-  - Erstellen Sie nun die Klasse ''Customer''. Implementieren Sie die Methoden gemäss der obigen Beschreibung.  + AdresseHochdorf 
-    * //HinweisSie können diese Klasse noch nicht testen, da die Klasse ''BankAccount'' fehlt. Das werden Sie später aber nachholen.//  +Angaben zum den Konti 
-  - Erstellen Sie nun die Klasse ''BankAccount'' gemäss der Beschreibung oben, aber ohne ''main''-Methode. +  Standard bank account 
-  - Fügen Sie der Klasse ''BankAccount'' nun noch die ''main''-Methode zu. Die Ausgabe muss wie folgt aussehen\\ {{:modul:m320:learningunits:lu06:aufgaben:lu06-aufg4_-_output_bankaccount.png?300|}} \\ +  Salary bank account
-  - Testen Sie die Klasse ''BankAccount'', bevor Sie diese für die weitere Arbeit nutzen. Dazu verwenden Sie die Klasse ''TestBankAccount'' in ''test_bank_account.py''. +
-  - Testen Sie nun die Klasse ''Customer''. Dazu verwenden Sie die Testklasse ''TestCustomer'' in der Datei ''test_customer.py''. +
-  - Erstellen Sie die Klasse ''SalaryAccount'' gemäss der Beschreibung oben. +
-  - Testen Sie die Klasse. Verwenden Sie dazu die Klasse ''TestSalaryaAccount'' in ''test_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.+
  
-  +von jedem Konto 750.0 beziehen 
-\\ + Bezug von Standard bank account 
-**Vorgehen Teil 2**\\ + Saldo = 250.
-  - Implementieren Sie die ''main''-Methode gemäss dem Sequenzdiagramm. + Bezug von Salary bank account 
-  - Ergänzen Sie wenn nötig den Konstruktoren von ''BancAccount'' für die Übergabe der Referenz an die Klasse ''Customer''+ Saldo = " 250.0 
-  - Den Teil "money draw" im Diagramm führen Sie zwei Mal aus. Einmal mit einem Bezug von 700 und einmal mit einem Bezug von 400Hier liefert Ihnen die Methode ''withdraw_money()'' den Wert ''True'', wenn ein Bezug von Geld möglich ist. Wenn nicht - weil Saldo zu klein - liefert sie ''False''. Dem entsprechend soll die Ausgabe am Bildschirm sein. Vergleichen Sie dazu unten den Printscreen.  +Aktuelles Vermögen500.0
-{{:modul:m320:learningunits:lu06:aufgaben:lu06-aufg6_sequenzdiagramm.png?650|}}+
  
-**Erwartetes Ergebnis**\\ +von jedem Konto noch einmal 400.0 beziehen 
-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.\\ + Bezug von Standard bank account 
-Alle gelb markierten stellen werden durch Attribute geliefert bzw. sind im print-Befehl der jeweiligen Klasse zu finden.\\ + Fehler: Bezug ist zu hoch für Saldo von 250.0 
-{{:modul:m320:learningunits:lu06:aufgaben:lu06-aufg6_ueberschreiben-3.png?500|}}\\ + Bezug von Salary bank account 
-===Dauer=== + Saldo = -150.0 
-3-5 Stunden (als Hausaufgabe)+Aktuelles Vermögen100.0
  
-=== Abgabe === +Ende Monat: 3000.- Lohn wird eingezahlt 
-auf github-classroom+Aktuelles Vermögen: 3100.0 
 +</code> 
 +====Dauer==== 
 +3-5 Stunden
  
 +==== Abgabe ====
 +Als Push im GitHub Classroom
 ---- ----
 {{tag>M320-LU10}} {{tag>M320-LU10}}
 [[https://creativecommons.org/licenses/by-nc-sa/4.0/|{{https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png}}]] René Probst, bearbeitet durch Marcel Suter [[https://creativecommons.org/licenses/by-nc-sa/4.0/|{{https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png}}]] René Probst, bearbeitet durch Marcel Suter
  
  • modul/m320_2024/learningunits/lu10/aufgaben/vererbung.1730096546.txt.gz
  • Zuletzt geändert: 2024/10/28 07:22
  • von msuter