回顾:支付处理器
本课属于 Coddy Dart 学习旅程的“面向对象编程”单元。第 62 课,共 110 课。
挑战
简单让我们构建一个支付处理系统,展示多态的强大之处!你将创建一个抽象支付方式类和几个具体实现,然后通过统一的接口处理不同类型的支付集合。
你将把代码分成两个文件:
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 在线编译器