银行系统
本课属于 Coddy Dart 学习旅程的“面向对象编程”单元。第 108 课,共 110 课。
挑战
简单让我们使用你在本课程中掌握的 OOP 原则,构建一个模拟现实金融业务的银行系统。你将创建具有不同规则的账户、跟踪交易并管理客户,所有内容都分布在多个文件中。
你的银行系统将分布在 6 个文件中:
transaction.dart:创建一个Transaction类,用于表示不可变的金融操作记录。每笔交易都有final字段,分别表示type(String,可为 "deposit"、"withdrawal" 或 "transfer")、amount(double)和timestamp(DateTime)。重写toString(),使其返回[type] $amount。account.dart:创建一个抽象的Account类,包含私有的_balance(double)、final账户号码(accountNumber,String),以及用于存储交易历史的List<Transaction>。添加一个用于获取余额的 getter、一个受保护的 setterset balance(double value)(以便其他文件中的子类可以更新余额)、一个由子类实现的抽象方法bool canWithdraw(double amount),以及以下具体方法:deposit(double amount):增加余额、记录一笔交易,并打印Deposited $amount. Balance: $balancewithdraw(double amount):如果canWithdraw()返回 true,则扣减余额、记录一笔交易,并打印Withdrew $amount. Balance: $balance。否则打印Withdrawal denied。getTransactionCount():返回交易数量
savings_account.dart:创建一个继承Account的SavingsAccount。储蓄账户设有取款限额,单笔交易不能取出超过 $500。实现canWithdraw()来执行此规则(同时确保余额充足)。添加一个方法applyInterest(double rate),使用balancegetter 和 setter,按给定的百分比利率增加余额,然后打印Interest applied. Balance: $balance。checking_account.dart:创建一个继承Account的CheckingAccount。支票账户提供最高 $100 的透支保护,账户余额可以为负数,但不能低于 -$100。实现canWithdraw(),只要取款后的余额不低于 -$100,就允许取款。customer.dart:创建一个Customer类,包含id(String)、name(String)和用于存放其账户的List<Account>。添加方法addAccount(Account account)来添加账户,并添加getTotalBalance(),使其返回所有账户余额的总和。重写toString(),使其返回Customer: name (X accounts)。main.dart:演示你的银行系统。创建一个客户(C001,John Smith)。创建一个SavingsAccount(SAV001,初始余额为 $1000)和一个CheckingAccount(CHK001,初始余额为 $500)。将两个账户添加到客户,并打印该客户。 然后执行以下操作:- 向储蓄账户存入 $200
- 从储蓄账户取出 $300(应成功)
- 尝试从储蓄账户取出 $600(应被拒绝,因为超过限额)
- 为储蓄账户增加 5% 的利息
- 从支票账户取出 $550(应使用透支额度成功)
- 再尝试从支票账户取出 $100(应被拒绝,因为会超过透支限额)
Savings transactions: X和Total balance: $Y(格式化为 2 位小数)。
预期输出:
Customer: John Smith (2 accounts)
Deposited $200.0. Balance: $1200.0
Withdrew $300.0. Balance: $900.0
Withdrawal denied
Interest applied. Balance: $945.0
Withdrew $550.0. Balance: $-50.0
Withdrawal denied
Savings transactions: 3
Total balance: $895.00亲手试试
import 'transaction.dart';
import 'account.dart';
import 'savings_account.dart';
import 'checking_account.dart';
import 'customer.dart';
void main() {
// TODO: 创建一个 id 为 "C001"、姓名为 "John Smith" 的客户
// TODO: 创建一个 accountNumber 为 "SAV001"、初始余额为 $1000 的 SavingsAccount
// TODO: 创建一个 accountNumber 为 "CHK001"、初始余额为 $500 的 CheckingAccount
// TODO: 将两个账户都添加到该客户名下
// TODO: 打印该客户的信息
// TODO: 执行以下操作:
// 1. 向储蓄账户存入 $200
// 2. 从储蓄账户取出 $300(应该成功)
// 3. 尝试从储蓄账户取出 $600(超过限额,应该被拒绝)
// 4. 为储蓄账户计入 5% 的利息
// 5. 从支票账户取出 $550(使用透支额度,应该成功)
// 6. 尝试再从支票账户取出 $100(将超过透支限额,应该被拒绝)
// TODO: 打印 "Savings transactions: X",其中 X 是交易笔数。
// TODO: 打印 "Total balance: \$Y",其中 Y 保留 2 位小数。
}
面向对象编程中的所有课
自己练习: Dart 在线编译器