Menu
Coddy logo textTech

Banka Defteri

Coddy'nin Kotlin Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 57 / 57.

challenge icon

Görev

Zor

Küçük bir banka oluşturun.

  • BankError(message), Exception sınıfını genişleten ve InvalidAmount (invalid amount), Insufficient(id) (insufficient funds in 2), WithdrawalLimit(id) (withdrawal limit on 2) ve NoAccount(id) (no account 9) alt sınıflarına sahip bir sealed sınıftır.
  • Account(id, owner) soyuttur. balance her yerden okunabilir ve yalnızca hesap sınıfları tarafından değiştirilebilir. deposit(amount) ve withdraw(amount), 1'in altındaki tutarlar için InvalidAmount hatası oluşturur; withdraw ise bakiye hesabın lowestBalance değerinin altına düşecekse Insufficient hatası oluşturur. Soyut kind özelliğini ve hiçbir şey yapmayan açık monthEnd() metodunu tanımlar.
  • Checking, -100'e kadar kredili mevduata izin verir. Savings hiçbir zaman 0'ın altına düşmez, ayda en fazla 2 para çekme işlemine (WithdrawalLimit) izin verir ve monthEnd() içinde %1 faiz (aşağı yuvarlanmış) ekleyerek para çekme sayacını sıfırlar.
  • Bank sınıfında open(kind, id, owner), account(id) (NoAccount hatası oluşturur), önce her iki hesabı bulan ve ardından para çekme ve yatırma işlemlerini gerçekleştiren transfer(from, to, amount), her hesap için monthEnd() ve kimliğe göre sıralanmış accounts() bulunur.

Sağlanan kod open checking 1 ada, open savings 2 bo, dep 1 100, wd 2 30, tr 1 2 50 veya month komutlarını okur; ok ya da hatanın mesajını yazdırır ve son olarak her hesabı 1 ada checking: -20 biçiminde yazdırır.

Kodunuz BankError.kt, InvalidAmount.kt, Insufficient.kt, WithdrawalLimit.kt, NoAccount.kt, Account.kt, Checking.kt, Savings.kt ve Bank.kt dosyalarına gelir. Main.kt, sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

fun main() {
    // Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
    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}")
}

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Kotlin playground