Metodo call()
Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 73 di 110.
Dart ha un metodo speciale chiamato call() che ti permette di usare un oggetto come se fosse una funzione. Quando una classe definisce un metodo call(), puoi richiamare le istanze di quella classe usando la sintassi di chiamata di funzione.
class Multiplier {
int factor;
Multiplier(this.factor);
int call(int value) {
return value * factor;
}
}
void main() {
var double = Multiplier(2);
var triple = Multiplier(3);
print(double(5)); // 10 - chiamare un oggetto come una funzione
print(triple(5)); // 15
}Invece di scrivere double.call(5), puoi semplicemente scrivere double(5). Dart invoca automaticamente il metodo call() quando usi le parentesi sull'oggetto.
Il metodo call() può accettare qualsiasi parametro e restituire qualsiasi tipo, proprio come un metodo normale:
class Greeter {
String prefix;
Greeter(this.prefix);
String call(String name, {String punctuation = '!'}) {
return '$prefix, $name$punctuation';
}
}
void main() {
var hello = Greeter('Hello');
print(hello('Alice')); // Hello, Alice!
print(hello('Bob', punctuation: '?')); // Hello, Bob?
}Questo schema è utile quando ti servono oggetti che si comportano come funzioni, ma mantengono anche uno stato o una configurazione. Viene comunemente usato per creare operazioni riutilizzabili, validatori o formattatori che devono ricordare le impostazioni tra una chiamata e l'altra.
Sfida
FacileCreiamo un sistema di formattazione del testo in cui gli oggetti formattatori possano essere chiamati direttamente come funzioni! Creerai classi invocabili che trasformano il testo in modi diversi mantenendo le proprie impostazioni di configurazione.
Organizzerai il codice in due file:
formatters.dart: crea due classi invocabili che trasformano le stringhe:- Una classe
Wrapperche racchiude il testo con un prefisso e un suffisso configurabili. Dovrebbe memorizzare le stringheprefixesuffixe il suo metodocall()dovrebbe accettare unString texte restituire il testo racchiuso tra il prefisso e il suffisso. - Una classe
Repeaterche ripete il testo un numero configurabile di volte. Dovrebbe memorizzare un interotimese il suo metodocall()dovrebbe accettare unString texte restituire il testo ripetuto quel numero di volte, separato da spazi.
- Una classe
main.dart: importa i tuoi formattatori e mostra come questi oggetti possano essere usati proprio come funzioni:- Crea un
Wrappercon il prefisso'['e il suffisso']' - Crea un altro
Wrappercon il prefisso'***'e il suffisso'***' - Crea un
Repeatercontimesimpostato su3 - Chiama il primo wrapper con
'Hello'e stampa il risultato - Chiama il secondo wrapper con
'Important'e stampa il risultato - Chiama il repeater con
'Go'e stampa il risultato - Mostra il concatenamento passando il risultato del primo wrapper (con
'Nested') al secondo wrapper, quindi stampa il risultato
- Crea un
Nota come puoi chiamare direttamente i tuoi oggetti formattatori usando le parentesi, proprio come normali funzioni. Il metodo call() lo rende possibile e ogni oggetto ricorda la propria configurazione tra un utilizzo e l'altro!
Risultato previsto:
[Hello]
***Important***
Go Go Go
***[Nested]***Provalo tu
import 'formatters.dart';
void main() {
// TODO: Crea un Wrapper con prefix '[' e suffix ']'
// TODO: Crea un altro Wrapper con prefix '***' e suffix '***'
// TODO: Crea un Repeater con times impostato su 3
// TODO: Chiama il primo wrapper con 'Hello' e stampa il risultato
// TODO: Chiama il secondo wrapper con 'Important' e stampa il risultato
// TODO: Chiama il repeater con 'Go' e stampa il risultato
// TODO: Mostra come concatenare le chiamate passando il risultato del primo wrapper
// (con 'Nested') al secondo wrapper e stampa il risultato
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
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