Libro mayor bancario
Parte de la sección Programación orientada a objetos del Journey de Kotlin de Coddy. Lección 57 de 57.
Desafío
DifícilConstruye un banco pequeño.
BankError(message)es una clase sellada que extiendeException, con las subclasesInvalidAmount(invalid amount),Insufficient(id)(insufficient funds in 2),WithdrawalLimit(id)(withdrawal limit on 2) yNoAccount(id)(no account 9).Account(id, owner)es abstracta. Subalancepuede leerse en cualquier lugar y solo las clases de cuenta pueden modificarlo.deposit(amount)ywithdraw(amount)lanzanInvalidAmountpara cantidades inferiores a 1, ywithdrawlanzaInsufficientcuando el saldo quedaría por debajo dellowestBalancede la cuenta. Declara elkindabstracto y unmonthEnd()abierto que no hace nada.Checkingpermite un descubierto de hasta -100.Savingsnunca baja de 0, permite como máximo 2 retiros por mes (WithdrawalLimit) y, enmonthEnd(), añade un 1 % de interés (redondeado hacia abajo) y reinicia el contador de retiros.Banktieneopen(kind, id, owner),account(id)(lanzaNoAccount),transfer(from, to, amount), que busca primero ambas cuentas y después retira y deposita,monthEnd()para cada cuenta yaccounts()ordenadas por id.
El código proporcionado lee los comandos open checking 1 ada, open savings 2 bo, dep 1 100, wd 2 30, tr 1 2 50 o month, imprime ok o el mensaje del error y, finalmente, cada cuenta como 1 ada checking: -20.
Tu código va en BankError.kt, InvalidAmount.kt, Insufficient.kt, WithdrawalLimit.kt, NoAccount.kt, Account.kt, Checking.kt, Savings.kt y Bank.kt. Main.kt contiene el código proporcionado de entrada/salida y no se puede editar.
Pruébalo tú mismo
fun main() {
// Código de entrada/salida suministrado: déjalo tal como está
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}")
}
Todas las lecciones de Programación orientada a objetos
1Clases y objetos
Trabajar con archivosDefinir clasesConstructores primariosBloques init y validaciónConstructores secundariosRepaso - Tarjeta de biblioteca4Herencia
Clases abiertas y subclasesSobrescritura de miembrossuper y constructoresClases abstractasRepaso: directorio del personal2Propiedades y encapsulación
Accesores personalizadosModificadores de visibilidadSetters privadoslazy y lateinitRepaso: cuenta bancaria5Interfaces
Declaración de interfacesMétodos predeterminadosInterfaces múltiplesInterfaces como tiposRepaso: métodos de pago8Genéricos
Funciones genéricasClases genéricasRestricciones de tiposVariancia con in y outRepaso - Cola de prioridad11Proyecto: Gestión de biblioteca
Libros y miembrosPréstamo de librosPractica por tu cuenta: Playground de Kotlin