Bankbuch
Teil des Abschnitts Objektorientierte Programmierung der Kotlin-Journey von Coddy. Lektion 57 von 57.
Aufgabe
SchwerErstelle eine kleine Bank.
BankError(message)ist eine versiegelte Klasse, dieExceptionerweitert, mit den UnterklassenInvalidAmount(invalid amount),Insufficient(id)(insufficient funds in 2),WithdrawalLimit(id)(withdrawal limit on 2) undNoAccount(id)(no account 9).Account(id, owner)ist abstrakt. Der Wert vonbalancekann überall gelesen und nur von den Kontoklassen geändert werden.deposit(amount)undwithdraw(amount)lösen bei Beträgen unter 1InvalidAmountaus, undwithdrawlöstInsufficientaus, wenn das Guthaben unter daslowestBalancedes Kontos fallen würde. Die Klasse deklariert das abstraktekindund eine offene MethodemonthEnd(), die nichts tut.Checkingerlaubt eine Überziehung bis -100.Savingsfällt nie unter 0, erlaubt höchstens 2 Abhebungen pro Monat (WithdrawalLimit) und addiert inmonthEnd()1 % Zinsen (abgerundet) und setzt den Abhebungszähler zurück.Bankverfügt überopen(kind, id, owner),account(id)(löstNoAccountaus),transfer(from, to, amount), das zuerst beide Konten sucht und anschließend abhebt und einzahlt,monthEnd()für jedes Konto sowieaccounts(), nach id sortiert.
Der bereitgestellte Code liest die Befehle open checking 1 ada, open savings 2 bo, dep 1 100, wd 2 30, tr 1 2 50 oder month, gibt ok oder die Fehlermeldung aus und schließlich jedes Konto als 1 ada checking: -20.
Dein Code gehört in BankError.kt, InvalidAmount.kt, Insufficient.kt, WithdrawalLimit.kt, NoAccount.kt, Account.kt, Checking.kt, Savings.kt und Bank.kt. Main.kt enthält den bereitgestellten Eingabe-/Ausgabecode und darf nicht bearbeitet werden.
Probier es selbst
fun main() {
// Gelieferter Ein-/Ausgabecode: belasse ihn wie er ist
val input = generateSequence(::readLine).toList()
val bank = Bank()
for (cmd in input) {
val p = cmd.split(" ")
try {
when (p[0]) {
"open" -> bank.open(p[1], p[2].toInt(), p[3])
"dep" -> bank.account(p[1].toInt()).deposit(p[2].toInt())
"wd" -> bank.account(p[1].toInt()).withdraw(p[2].toInt())
"tr" -> bank.transfer(p[1].toInt(), p[2].toInt(), p[3].toInt())
else -> bank.monthEnd()
}
println("ok")
} catch (e: BankError) {
println(e.message)
}
}
for (a in bank.accounts()) println("${a.id} ${a.owner} ${a.kind}: ${a.balance}")
}
Alle Lektionen in Objektorientierte Programmierung
1Klassen und Objekte
Arbeiten mit DateienKlassen definierenPrimärkonstruktoreninit-Blöcke und ValidierungSekundärkonstruktorenRückblick – Bibliotheksausweis4Vererbung
Offene Klassen und UnterklassenÜberschreiben von Membernsuper und KonstruktorenAbstrakte KlassenRückblick – Mitarbeiterverzeichnis2Eigenschaften und Kapselung
Benutzerdefinierte ZugriffsmethodenSichtbarkeitsmodifikatorenPrivate Setterlazy und lateinitWiederholung – Bankkonto5Schnittstellen
Schnittstellen deklarierenStandardmethodenMehrere SchnittstellenSchnittstellen als TypenRückblick – Zahlungsmethoden8Generics
Generische FunktionenGenerische KlassenTypbeschränkungenVarianz mit in und outRückblick – Prioritätswarteschlange11Projekt: Bibliotheksverwaltung
Bücher und MitgliederBücher ausleihenÜbe selbstständig: Kotlin-Playground