Registro bancario
Fa parte della sezione Programmazione orientata agli oggetti del percorso Kotlin di Coddy. Lezione 57 di 57.
Sfida
DifficileCrea una piccola banca.
BankError(message)è una classe sealed che estendeException, con le sottoclassiInvalidAmount(invalid amount),Insufficient(id)(insufficient funds in 2),WithdrawalLimit(id)(withdrawal limit on 2) eNoAccount(id)(no account 9).Account(id, owner)è astratta. Il suobalancepuò essere letto ovunque e modificato solo dalle classi degli account.deposit(amount)ewithdraw(amount)generanoInvalidAmountper importi inferiori a 1, ewithdrawgeneraInsufficientquando il saldo scenderebbe al di sotto dellowestBalancedell'account. Dichiarakindcome astratto e unmonthEnd()open che non fa nulla.Checkingconsente uno scoperto fino a -100.Savingsnon scende mai sotto 0, consente al massimo 2 prelievi al mese (WithdrawalLimit) e, inmonthEnd(), aggiunge l'1% di interesse (arrotondato per difetto) e azzera il conteggio dei prelievi.Bankdispone diopen(kind, id, owner),account(id)(generaNoAccount),transfer(from, to, amount), che cerca prima entrambi gli account e poi preleva e deposita,monthEnd()per ogni account eaccounts()ordinati per id.
Il codice fornito legge i comandi open checking 1 ada, open savings 2 bo, dep 1 100, wd 2 30, tr 1 2 50 o month, stampa ok o il messaggio dell'errore e infine ogni account come 1 ada checking: -20.
Il tuo codice va inserito in BankError.kt, InvalidAmount.kt, Insufficient.kt, WithdrawalLimit.kt, NoAccount.kt, Account.kt, Checking.kt, Savings.kt e Bank.kt. Main.kt contiene il codice fornito per l'input/output e non può essere modificato.
Provalo tu
fun main() {
// Codice di input/output fornito: lascialo così com'è
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}")
}
Tutte le lezioni di Programmazione orientata agli oggetti
1Classi e oggetti
Lavorare con i fileDefinire le classiCostruttori primariBlocchi init e convalidaCostruttori secondariRiepilogo - Tessera della biblioteca4Ereditarietà
Classi aperte e sottoclassiRidefinizione dei membrisuper e costruttoriClassi astratteRiepilogo - Elenco del personale2Proprietà e incapsulamento
Accessor personalizzatiModificatori di visibilitàSetter privatilazy e lateinitRipasso - Conto bancario5Interfacce
Dichiarare le interfacceMetodi predefinitiInterfacce multipleLe interfacce come tipiRiepilogo - Metodi di pagamento8Tipi generici
Funzioni genericheClassi genericheVincoli sui tipiVarianza con in e outRiepilogo - Coda con priorità11Progetto: Gestione della biblioteca
Libri e sociPrendere in prestito i libriEsercitati da solo: Playground Kotlin