Menu
Coddy logo textTech

Итоги — Обработчик платежей

Часть раздела Объектно-ориентированное программирование путешествия по Dart на Coddy — урок 62 из 110.

challenge icon

Задание

Легко

Давайте создадим систему обработки платежей, которая продемонстрирует мощь полиморфизма! Вы создадите абстрактный класс метода оплаты и несколько конкретных реализаций, а затем обработаете коллекцию различных типов платежей через единый интерфейс.

Вы организуете свой код в двух файлах:

  • payments.dart: Определите здесь вашу иерархию платежей:
    • Абстрактный класс PaymentMethod со свойством String accountHolder, конструктором и абстрактным методом processPayment(double amount)
    • Класс CreditCard, который расширяет PaymentMethod дополнительным свойством String cardNumber (только последние 4 цифры). Его метод processPayment должен выводить Processing $[amount] via Credit Card ****[cardNumber] for [accountHolder]
    • Класс PayPal, который расширяет PaymentMethod дополнительным свойством String email. Его метод processPayment должен выводить Processing $[amount] via PayPal ([email]) for [accountHolder]
    • Класс BankTransfer, который расширяет PaymentMethod дополнительным свойством 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)
    • После обработки всех платежей подсчитывает, сколько из них имеют тип CreditCard, используя оператор is, и выводит Credit card payments: [count]
  • main.dart: Импортируйте файл с платежами и продемонстрируйте работу процессора платежей:
    • Создайте List<PaymentMethod>, содержащий:
      • CreditCard для 'Alice Smith' с номером карты '1234'
      • PayPal для 'Bob Jones' с email 'bob@email.com'
      • BankTransfer для 'Carol White' с банком 'National Bank'
      • CreditCard для 'David Brown' с номером карты '5678'
    • Вызовите processAllPayments с этим списком и суммой 99.99

Обратите внимание, как функция 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>, содержащий:
  // - CreditCard для 'Alice Smith' с номером карты '1234'
  // - PayPal для 'Bob Jones' с email 'bob@email.com'
  // - BankTransfer для 'Carol White' с банком 'National Bank'
  // - CreditCard для 'David Brown' с номером карты '5678'
  
  // TODO: Вызовите processAllPayments со списком и суммой 99.99
}

Все уроки раздела Объектно-ориентированное программирование