Menu
Coddy logo textTech

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.

challenge icon

Sfida

Facile

Creiamo 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 Wrapper che racchiude il testo con un prefisso e un suffisso. Dovrebbe memorizzare un String prefix e un String suffix e, quando viene chiamata con un parametro String text, restituire il testo racchiuso tra il prefisso e il suffisso.
    • Una classe Repeater che ripete il testo un certo numero di volte. Dovrebbe memorizzare un valore int times e, quando viene chiamata con un parametro String text, restituire il testo ripetuto quel numero di volte, con uno spazio tra ogni ripetizione.
  • main.dart: importa i tuoi formattatori e mostra come funzionano le classi invocabili:
    • Crea un Wrapper con prefisso "[" e suffisso "]"
    • Crea un altro Wrapper con prefisso "***" e suffisso "***"
    • Crea un Repeater che 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

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
  
}
quiz iconMettiti alla prova

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

Esercitati da solo: Compilatore Dart online