Итоги — Обработчик платежей
Часть раздела Объектно-ориентированное программирование путешествия по Dart на Coddy — урок 62 из 110.
Задание
ЛегкоДавайте создадим систему обработки платежей, которая продемонстрирует мощь полиморфизма! Вы создадите абстрактный класс метода оплаты и несколько конкретных реализаций, а затем обработаете коллекцию различных типов платежей через единый интерфейс.
Вы организуете свой код в двух файлах:
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
}
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыБиблиотеки и импортВведение в ООПКлассы и объектыКлючевое слово thisМетодыПеременные экземпляраОсновы конструкторовИтоги — Простой калькулятор4Null-безопасность
Введение в Null-безопасностьNullable и Non-Nullable типыОператоры ? и !Ключевое слово Late и Null-безопасностьNull-aware операторыNull-безопасность в классахИтоги — Система профилей пользователей7Абстрактные классы и интерфейсы
Абстрактные классыАбстрактные методыИнтерфейсы в DartНеявные интерфейсыРеализация против наследованияМножественные интерфейсыИтоги — Калькулятор фигур10Коллекции и обобщения
Обзор List, Set, MapТипобезопасные коллекцииОбобщенные классыОбобщенные методыОграничения обобщенийIterable и IteratorИтоги: Обобщенное хранилище13Продвинутые концепции ООП
Композиция против наследованияМетоды расширенияВызываемые классыЗапечатанные классы (Dart 3)Записи (Dart 3)Паттерны и сопоставление (3.0)Перечисления с методами16Проект: Управление библиотекой
Обзор проектаКлассы Book и User2Конструкторы в Dart
Конструктор по умолчаниюИменованные конструкторыСписки инициализацииКонстантные конструкторыФабричные конструкторыПеренаправляющие конструкторыИтоги — Shape Builder5Инкапсуляция
Публичные и приватные членыСоглашение о префиксе _Приватность на уровне библиотекГеттеры и сеттеры: подробный разборСкрытие данныхИтоги — Записи о студентах8Mixins
Введение в MixinsСоздание MixinsИспользование нескольких MixinsКлючевое слово on в MixinsMixin и наследованиеMixin и интерфейсИтоги: Система животных11Специальные методы
Переопределение toString()Переопределение hashCode и ==Интерфейс ComparableМетод call()Переопределение noSuchMethodПовторение — Пользовательская коллекция14Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy3Свойства классов
Члены экземпляра и статические членыПоля Final и ConstПеременные LateСтатические методы и поляГеттеры и сеттерыИтоги — Менеджер банковского счета6Наследование
Основы наследованияКлючевое слово superПереопределение методовАннотация @overrideКлючевое слово final для классовКонструкторы и наследованиеИтоги: Иерархия сотрудников9Полиморфизм
Основы полиморфизмаПолиморфизм через интерфейсыПроверка типов во время выполненияОператоры is и asКлючевое слово covariantИтоги — Обработчик платежей12Асинхронное ООП
Futures и async/awaitОсновы StreamsКонтроллеры StreamАсинхронные конструкторыАсинхронность в методах классовИтоги — Data Fetcher15Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн Репозиторий