Registre bancaire
Fait partie de la section Programmation orientée objet du Journey Kotlin de Coddy. Leçon 57 sur 57.
Défi
DifficileConstruisez une petite banque.
BankError(message)est une classe scellée qui étendException, avec les sous-classesInvalidAmount(invalid amount),Insufficient(id)(insufficient funds in 2),WithdrawalLimit(id)(withdrawal limit on 2) etNoAccount(id)(no account 9).Account(id, owner)est abstraite. Sonbalancepeut être lu partout et modifié uniquement par les classes de comptes.deposit(amount)etwithdraw(amount)lèventInvalidAmountpour les montants inférieurs à 1, etwithdrawlèveInsufficientlorsque le solde passerait sous lelowestBalancedu compte. Elle déclare lekindabstrait ainsi qu'unmonthEnd()ouvert qui ne fait rien.Checkingautorise un découvert jusqu'à -100.Savingsne descend jamais sous 0, autorise au plus 2 retraits par mois (WithdrawalLimit) et, dansmonthEnd(), ajoute 1 % d'intérêts (arrondis à l'entier inférieur) et réinitialise le nombre de retraits.Bankpossèdeopen(kind, id, owner),account(id)(qui lèveNoAccount),transfer(from, to, amount), qui recherche d'abord les deux comptes puis effectue le retrait et le dépôt,monthEnd()pour chaque compte etaccounts()trié par identifiant.
Le code fourni lit les commandes open checking 1 ada, open savings 2 bo, dep 1 100, wd 2 30, tr 1 2 50 ou month, affiche ok ou le message de l'erreur, puis affiche finalement chaque compte sous la forme 1 ada checking: -20.
Votre code doit être placé dans BankError.kt, InvalidAmount.kt, Insufficient.kt, WithdrawalLimit.kt, NoAccount.kt, Account.kt, Checking.kt, Savings.kt et Bank.kt. Main.kt contient le code fourni de lecture des entrées et d'affichage des sorties et ne peut pas être modifié.
Essayez vous-même
fun main() {
// Code d'entrée/sortie fourni : le garder tel quel
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}")
}
Toutes les leçons de Programmation orientée objet
1Classes et objets
Travailler avec des fichiersDéfinir des classesConstructeurs primairesBlocs init et validationConstructeurs secondairesRécapitulatif - Carte de bibliothèque4Héritage
Classes ouvertes et sous-classesRedéfinition des membressuper et constructeursClasses abstraitesRécapitulatif – Annuaire du personnel2Propriétés et encapsulation
Accesseurs personnalisésModificateurs de visibilitéSetters privéslazy et lateinitRécapitulatif - Compte bancaire5Interfaces
Déclarer des interfacesMéthodes par défautInterfaces multiplesInterfaces en tant que typesRécapitulatif - Méthodes de paiement8Génériques
Fonctions génériquesClasses génériquesContraintes de typeVariance avec in et outRécapitulatif - File de priorité11Projet : Gestion de bibliothèque
Livres et membresEmprunter des livresEntraînez-vous par vous-même : Playground Kotlin