Menu
CoddyTech

回顾:支付处理器

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

challenge icon

挑战

简单

让我们构建一个支付处理系统,展示多态的强大之处!你将创建一个抽象支付方式类和几个具体实现,然后通过统一的接口处理不同类型的支付集合。

你将把代码分成两个文件:

  • payments.dart:在这里定义支付类层次结构:
    • 一个抽象类 PaymentMethod,包含一个 String accountHolder 属性、一个构造函数和一个抽象方法 processPayment(double amount)
    • 一个继承 PaymentMethod 的 CreditCard 类,额外包含一个 String cardNumber 属性(仅包含最后 4 位数字)。它的 processPayment 应输出 Processing $[amount] via Credit Card ****[cardNumber] for [accountHolder]
    • 一个继承 PaymentMethod 的 PayPal 类,额外包含一个 String email 属性。它的 processPayment 应输出 Processing $[amount] via PayPal ([email]) for [accountHolder]
    • 一个继承 PaymentMethod 的 BankTransfer 类,额外包含一个 String bankName 属性。它的 processPayment 应输出 Processing $[amount] via Bank Transfer from [bankName] for [accountHolder]
    另外,创建一个函数 processAllPayments(List<PaymentMethod> methods, double amount),使其能够:
    • 输出 Processing [count] payments of $[amount] each:,其中 count 是支付方式的数量
    • 遍历每种支付方式,并调用 processPayment(amount)
    • 处理完所有支付后,使用 is 运算符统计其中有多少个属于 CreditCard 类型,并输出 Credit card payments: [count]
  • main.dart:导入支付文件,并演示支付处理器:
    • 创建一个 List<PaymentMethod>,其中包含:
      • 一张属于 'Alice Smith'、卡号为 '1234' 的 CreditCard
      • 一个属于 'Bob Jones'、邮箱为 'bob@email.com' 的 PayPal
      • 一笔属于 'Carol White'、银行为 'National Bank' 的 BankTransfer
      • 一张属于 'David Brown'、卡号为 '5678' 的 CreditCard
    • 使用此列表和金额 99.99 调用 processAllPayments

注意,processAllPayments 函数使用抽象的 PaymentMethod 类型,但每笔支付都会根据其具体实现进行处理。最后的类型检查展示了你仍然可以在需要时识别特定类型。

预期输出:

Processing 4 payments of $99.99 each:
Processing $99.99 via Credit Card ****1234 for Alice Smith
Processing $99.99 via PayPal (bob@email.com) for Bob Jones
Processing $99.99 via Bank Transfer from National Bank for Carol White
Processing $99.99 via Credit Card ****5678 for David Brown
Credit card payments: 2

亲手试试

import 'payments.dart';

void main() {
  // TODO: 创建一个 List<PaymentMethod>,包含:
  // - 为 'Alice Smith' 创建 CreditCard,卡号为 '1234'
  // - 为 'Bob Jones' 创建 PayPal,邮箱为 'bob@email.com'
  // - 为 'Carol White' 创建 BankTransfer,银行为 'National Bank'
  // - 为 'David Brown' 创建 CreditCard,卡号为 '5678'
  
  // TODO: 调用 processAllPayments,传入该列表和金额 99.99
}

面向对象编程中的所有课

自己练习: Dart 在线编译器