Resumen - Procesador de pagos
Parte de la sección Programación Orientada a Objetos del Journey de Dart de Coddy — lección 62 de 110.
Desafío
Fácil¡Vamos a construir un sistema de procesamiento de pagos que demuestre el poder del polimorfismo! Crearás una clase abstracta de método de pago y varias implementaciones concretas, luego procesarás una colección de diferentes tipos de pago a través de una interfaz unificada.
Organizarás tu código en dos archivos:
payments.dart: Define tu jerarquía de pagos aquí:- Una clase abstracta
PaymentMethodcon una propiedadString accountHolder, un constructor y un método abstractoprocessPayment(double amount) - Una clase
CreditCardque extiendePaymentMethodcon una propiedad adicionalString cardNumber(solo los últimos 4 dígitos). SuprocessPaymentdebe imprimirProcessing $[amount] via Credit Card ****[cardNumber] for [accountHolder] - Una clase
PayPalque extiendePaymentMethodcon una propiedad adicionalString email. SuprocessPaymentdebe imprimirProcessing $[amount] via PayPal ([email]) for [accountHolder] - Una clase
BankTransferque extiendePaymentMethodcon una propiedad adicionalString bankName. SuprocessPaymentdebe imprimirProcessing $[amount] via Bank Transfer from [bankName] for [accountHolder]
processAllPayments(List<PaymentMethod> methods, double amount)que:- Imprima
Processing [count] payments of $[amount] each:donde count es el número de métodos de pago - Itere a través de cada método de pago y llame a
processPayment(amount) - Después de procesar todos los pagos, cuente cuántos son de tipo
CreditCardusando el operadorise imprimaCredit card payments: [count]
- Una clase abstracta
main.dart: Importa tu archivo de pagos y demuestra el procesador de pagos:- Crea una
List<PaymentMethod>que contenga:- Un
CreditCardpara'Alice Smith'con el número de tarjeta'1234' - Un
PayPalpara'Bob Jones'con el correo electrónico'bob@email.com' - Un
BankTransferpara'Carol White'con el banco'National Bank' - Un
CreditCardpara'David Brown'con el número de tarjeta'5678'
- Un
- Llama a
processAllPaymentscon esta lista y el monto99.99
- Crea una
Observa cómo la función processAllPayments trabaja con el tipo abstracto PaymentMethod, sin embargo, cada pago se procesa de acuerdo con su implementación específica. La comprobación de tipos al final demuestra cómo todavía puedes identificar tipos específicos cuando sea necesario.
Salida esperada:
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: 2Pruébalo tú mismo
import 'payments.dart';
void main() {
// TODO: Crear una List<PaymentMethod> que contenga:
// - CreditCard para 'Alice Smith' con número de tarjeta '1234'
// - PayPal para 'Bob Jones' con correo electrónico 'bob@email.com'
// - BankTransfer para 'Carol White' con banco 'National Bank'
// - CreditCard para 'David Brown' con número de tarjeta '5678'
// TODO: Llamar a processAllPayments con la lista y el monto 99.99
}
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de POO
Archivos externosLibrerías e importacionesIntroducción a la POOClases vs. ObjetosLa palabra clave thisMétodosVariables de instanciaConceptos básicos de constructoresResumen - Calculadora sencilla4Seguridad de nulos
Introducción a la seguridad de nulosNulables vs No nulablesLos operadores ? y !Palabra clave Late y Null SafetyOperadores Null-awareNull Safety en clasesResumen - Sistema de perfil de usuario7Clases abstractas e interfaces
Clases abstractasMétodos abstractosInterfaces en DartInterfaces implícitasImplementar vs. ExtenderInterfaces múltiplesRepaso - Calculadora de figuras10Colecciones y Genéricos
Visión general de List, Set y MapColecciones con seguridad de tiposClases genéricasMétodos genéricosRestricciones genéricasIterable e IteratorResumen - Almacenamiento genérico2Constructores en Dart
Constructor por defectoConstructores nombradosListas de inicializaciónConstructores constantesConstructores de fábricaConstructores de redireccionamientoResumen - Constructor de formas5Encapsulamiento
Miembros públicos vs. privadosLa convención del prefijo _Privacidad a nivel de libreríaProfundidad en Getters y SettersOcultamiento de informaciónResumen - Registros de estudiantes8Mixins
Introducción a los MixinsCreación de MixinsUso de múltiples MixinsPalabra clave on en MixinsMixin vs HerenciaMixin vs InterfazResumen - Sistema Animal11Métodos especiales
Sobrescritura de toString()Sobrescritura de hashCode y ==Interfaz ComparableMétodo call()Sobrescritura de noSuchMethodResumen - Colección personalizada14Patrones de diseño Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy3Propiedades de clase
Miembros de instancia vs. estáticosCampos Final y ConstVariables LateMétodos y campos estáticosGetters y SettersResumen - Gestor de cuentas bancarias6Herencia
Herencia básicaLa palabra clave superSobrescritura de métodosLa anotación @overrideLa palabra clave final en clasesConstructores y herenciaResumen - Jerarquía de empleados9Polimorfismo
Fundamentos del polimorfismoPolimorfismo mediante interfacesComprobación de tipos en tiempo de ejecuciónLos operadores is y asPalabra clave covariantResumen - Procesador de pagos12POO Asíncrona
Futures y async/awaitFundamentos de StreamsStream ControllersConstructores asíncronosAsincronía en métodos de claseRepaso - Data Fetcher15Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository