Menu
Coddy logo textTech

Bankbuch

Teil des Abschnitts Objektorientierte Programmierung der Kotlin-Journey von Coddy. Lektion 57 von 57.

challenge icon

Aufgabe

Schwer

Erstelle eine kleine Bank.

  • BankError(message) ist eine versiegelte Klasse, die Exception erweitert, mit den Unterklassen InvalidAmount (invalid amount), Insufficient(id) (insufficient funds in 2), WithdrawalLimit(id) (withdrawal limit on 2) und NoAccount(id) (no account 9).
  • Account(id, owner) ist abstrakt. Der Wert von balance kann überall gelesen und nur von den Kontoklassen geändert werden. deposit(amount) und withdraw(amount) lösen bei Beträgen unter 1 InvalidAmount aus, und withdraw löst Insufficient aus, wenn das Guthaben unter das lowestBalance des Kontos fallen würde. Die Klasse deklariert das abstrakte kind und eine offene Methode monthEnd(), die nichts tut.
  • Checking erlaubt eine Überziehung bis -100. Savings fällt nie unter 0, erlaubt höchstens 2 Abhebungen pro Monat (WithdrawalLimit) und addiert in monthEnd() 1 % Zinsen (abgerundet) und setzt den Abhebungszähler zurück.
  • Bank verfügt über open(kind, id, owner), account(id) (löst NoAccount aus), transfer(from, to, amount), das zuerst beide Konten sucht und anschließend abhebt und einzahlt, monthEnd() für jedes Konto sowie accounts(), 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

Übe selbstständig: Kotlin-Playground