Menu
CoddyTech

银行系统

本课属于 Coddy Dart 学习旅程的“面向对象编程”单元。第 108 课,共 110 课。

challenge icon

挑战

简单

让我们使用你在本课程中掌握的 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、一个受保护的 setter set balance(double value)(以便其他文件中的子类可以更新余额)、一个由子类实现的抽象方法 bool canWithdraw(double amount),以及以下具体方法:
    • deposit(double amount):增加余额、记录一笔交易,并打印 Deposited $amount. Balance: $balance
    • withdraw(double amount):如果 canWithdraw() 返回 true,则扣减余额、记录一笔交易,并打印 Withdrew $amount. Balance: $balance。否则打印 Withdrawal denied。
    • getTransactionCount():返回交易数量
  • savings_account.dart:创建一个继承 Account 的 SavingsAccount。储蓄账户设有取款限额,单笔交易不能取出超过 $500。实现 canWithdraw() 来执行此规则(同时确保余额充足)。添加一个方法 applyInterest(double rate),使用 balance getter 和 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)。将两个账户添加到客户,并打印该客户。 然后执行以下操作:
    1. 向储蓄账户存入 $200
    2. 从储蓄账户取出 $300(应成功)
    3. 尝试从储蓄账户取出 $600(应被拒绝,因为超过限额)
    4. 为储蓄账户增加 5% 的利息
    5. 从支票账户取出 $550(应使用透支额度成功)
    6. 再尝试从支票账户取出 $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 在线编译器