Classi chiamabili
Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 84 di 110.
In Dart, puoi rendere le istanze di una classe invocabili come funzioni implementando il metodo call(). Questo ti consente di usare un oggetto con la sintassi di chiamata di una funzione, applicando direttamente le parentesi all'istanza.
class Multiplier {
final 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 l'oggetto come una funzione
print(triple(5)); // 15
}Quando scrivi double(5), Dart invoca automaticamente il metodo call() con 5 come argomento. L'oggetto si comporta come una funzione pur mantenendo il proprio stato (il campo factor).
Il metodo call() può avere qualsiasi firma: più parametri, parametri facoltativi o persino restituire tipi diversi:
class Greeter {
final String greeting;
Greeter(this.greeting);
String call(String name, {String punctuation = '!'}) {
return '$greeting, $name$punctuation';
}
}
void main() {
var hello = Greeter('Hello');
print(hello('Alice')); // Hello, Alice!
print(hello('Bob', punctuation: '.')); // Hello, Bob.
}Le classi richiamabili sono utili quando hai bisogno di un comportamento simile a quello di una funzione combinato con uno stato o una configurazione. Sono comunemente usate per creare operazioni, validatori o trasformazioni riutilizzabili che devono ricordare le impostazioni tra una chiamata e l’altra.
Sfida
FacileCreiamo un sistema di formattazione del testo usando classi invocabili! Creerai oggetti che possono essere chiamati come funzioni per trasformare 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 il testo:- Una classe
Wrapperche racchiude il testo con un prefisso e un suffisso. Dovrebbe memorizzare unString prefixe unString suffixe, quando viene chiamata con un parametroString text, restituire il testo racchiuso tra il prefisso e il suffisso. - Una classe
Repeaterche ripete il testo un certo numero di volte. Dovrebbe memorizzare un valoreint timese, quando viene chiamata con un parametroString text, restituire il testo ripetuto quel numero di volte, con uno spazio tra ogni ripetizione.
- Una classe
main.dart: importa i tuoi formattatori e mostra come funzionano le classi invocabili:- Crea un
Wrappercon prefisso"["e suffisso"]" - Crea un altro
Wrappercon prefisso"***"e suffisso"***" - Crea un
Repeaterche ripete 3 volte - 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 - Infine, combinali: chiama il primo wrapper con il risultato della chiamata al repeater con
"Dart"e stampa il risultato
- Crea un
Nota come ogni oggetto formattatore ricordi la propria configurazione e possa essere chiamato direttamente con le parentesi, proprio come una funzione!
Output previsto:
[Hello]
***Important***
Go Go Go
[Dart Dart Dart]Provalo tu
import 'formatters.dart';
void main() {
// TODO: Crea un Wrapper con prefisso "[" e suffisso "]"
// TODO: Crea un altro Wrapper con prefisso "***" e suffisso "***"
// TODO: Crea un Repeater che ripeta 3 volte
// 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: Combinali: chiama il primo wrapper con il risultato della
// chiamata al repeater con "Dart" 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