Riepilogo - Elaboratore di pagamenti
Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 62 di 110.
Sfida
FacileCostruiamo un sistema di elaborazione dei pagamenti che dimostri la potenza del polimorfismo! Creerai una classe astratta per i metodi di pagamento e diverse implementazioni concrete, poi elaborerai una raccolta di tipi di pagamento diversi tramite un'interfaccia unificata.
Organizzerai il codice in due file:
payments.dart: definisci qui la gerarchia dei metodi di pagamento:- Una classe astratta
PaymentMethodcon una proprietàString accountHolder, un costruttore e un metodo astrattoprocessPayment(double amount) - Una classe
CreditCardche estendePaymentMethodcon una proprietà aggiuntivaString cardNumber(solo le ultime 4 cifre). Il suo metodoprocessPaymentdovrebbe stampareProcessing $[amount] via Credit Card ****[cardNumber] for [accountHolder] - Una classe
PayPalche estendePaymentMethodcon una proprietà aggiuntivaString email. Il suo metodoprocessPaymentdovrebbe stampareProcessing $[amount] via PayPal ([email]) for [accountHolder] - Una classe
BankTransferche estendePaymentMethodcon una proprietà aggiuntivaString bankName. Il suo metodoprocessPaymentdovrebbe stampareProcessing $[amount] via Bank Transfer from [bankName] for [accountHolder]
processAllPayments(List<PaymentMethod> methods, double amount)che:- Stampi
Processing [count] payments of $[amount] each:dove count è il numero di metodi di pagamento - Iteri su ogni metodo di pagamento e chiami
processPayment(amount) - Dopo aver elaborato tutti i pagamenti, conti quanti sono di tipo
CreditCardusando l'operatoreise stampiCredit card payments: [count]
- Una classe astratta
main.dart: importa il file dei pagamenti e mostra il funzionamento del sistema di elaborazione dei pagamenti:- Crea una
List<PaymentMethod>contenente:- Una
CreditCardper'Alice Smith'con numero di carta'1234' - Una
PayPalper'Bob Jones'con email'bob@email.com' - Una
BankTransferper'Carol White'con banca'National Bank' - Una
CreditCardper'David Brown'con numero di carta'5678'
- Una
- Chiama
processAllPaymentscon questa lista e l'importo99.99
- Crea una
Nota come la funzione processAllPayments lavori con il tipo astratto PaymentMethod, mentre ogni pagamento viene elaborato secondo la propria implementazione specifica. Il controllo dei tipi alla fine mostra come sia comunque possibile identificare tipi specifici quando necessario.
Output previsto:
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: 2Provalo tu
import 'payments.dart';
void main() {
// TODO: Crea una List<PaymentMethod> contenente:
// - CreditCard per 'Alice Smith' con numero di carta '1234'
// - PayPal per 'Bob Jones' con indirizzo email 'bob@email.com'
// - BankTransfer per 'Carol White' con banca 'National Bank'
// - CreditCard per 'David Brown' con numero di carta '5678'
// TODO: Chiama processAllPayments con la lista e l'importo 99.99
}
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniLibrerie e importazioniIntroduzione alla programmazione orientata agli oggettiClassi e oggettiLa parola chiave thisMetodiVariabili di istanzaFondamenti dei costruttoriRiepilogo - Calcolatrice semplice4Sicurezza dei valori null
Introduzione alla sicurezza dei valori nullNullable e non nullableGli operatori ? e !La keyword late e la sicurezza dei valori nullOperatori null-awareSicurezza dei valori null nelle classiRiepilogo - Sistema di profili utente7Classi astratte e interfacce
Classi astratteMetodi astrattiInterfacce in DartInterfacce impliciteImplementare vs estendereInterfacce multipleRiepilogo - Calcolatore di forme10Collezioni e generici
Panoramica di List, Set e MapCollezioni sicure rispetto ai tipiClassi genericheMetodi genericiVincoli sui genericiIterable e IteratorRiepilogo - Archiviazione generica13Concetti avanzati di OOP
Composizione vs ereditarietàMetodi di estensioneClassi chiamabiliClassi sealed (Dart 3)Record (Dart 3)Pattern e matching (3.0)Enum con metodi16Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente2I costruttori in Dart
Costruttore predefinitoCostruttori con nomeListe di inizializzazioneCostruttori costantiCostruttori factoryCostruttori di reindirizzamentoRiepilogo - Crea forme5Incapsulamento
Membri pubblici e privatiConvenzione del prefisso _Visibilità a livello di libreriaApprofondimento su getter e setterNascondimento delle informazioniRiepilogo - Registri degli studenti8Mixin
Introduzione ai MixinCreare MixinUsare più MixinParola chiave on nei MixinMixin vs ereditarietàMixin vs interfacciaRiepilogo - Sistema animale11Metodi speciali
Sovrascrittura di toString()Sovrascrittura di hashCode e ==Interfaccia ComparableMetodo call()Sovrascrittura di noSuchMethodRiepilogo - Collezione personalizzata14Modelli di progettazione Parte 1
Introduzione ai modelli di progettazioneSingletonFactoryObserverStrategy3Proprietà delle classi
Membri di istanza e staticiCampi final e constVariabili lateMetodi e campi staticiGetter e setterRiepilogo - Gestore di conti bancari6Ereditarietà
Ereditarietà di baseLa parola chiave superOverride dei metodiL’annotazione @overrideLa parola chiave final per le classiCostruttori ed ereditarietàRiepilogo - Gerarchia dei dipendenti9Polimorfismo
Fondamenti di polimorfismoPolimorfismo tramite interfacceControllo del tipo a runtimeGli operatori is e asParola chiave covariantRiepilogo - Elaboratore di pagamenti12OOP asincrona
Future e async/awaitNozioni di base sugli streamController degli streamCostruttori asincroniAsync nei metodi di classeRiepilogo - Recupero dei dati15Pattern di progettazione Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositePattern RepositoryEsercitati da solo: Compilatore Dart online