Menu
Coddy logo textTech

Méthode call()

Fait partie de la section Programmation Orientée Objet du Journey Dart de Coddy — leçon 73 sur 110.

Dart possède une méthode spéciale appelée call() qui vous permet d'utiliser un objet comme s'il s'agissait d'une fonction. Lorsqu'une classe définit une méthode call(), vous pouvez invoquer des instances de cette classe en utilisant la syntaxe d'appel de fonction.

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 - appel de l'objet comme une fonction
  print(triple(5));  // 15
}

Au lieu d'écrire double.call(5), vous pouvez simplement écrire double(5). Dart appelle automatiquement la méthode call() lorsque vous utilisez des parenthèses sur l'objet.

La méthode call() peut accepter n'importe quels paramètres et retourner n'importe quel type, tout comme une méthode classique :

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 ?
}

Ce patron est utile lorsque vous avez besoin d'objets qui se comportent comme des fonctions mais qui conservent également un état ou une configuration. Il est couramment utilisé pour créer des opérations réutilisables, des validateurs ou des formateurs qui doivent mémoriser des paramètres entre les appels.

challenge icon

Défi

Facile

Construisons un système de formateur de texte où les objets formateurs peuvent être appelés directement comme des fonctions ! Vous allez créer des classes appelables qui transforment le texte de différentes manières tout en conservant leurs paramètres de configuration.

Vous organiserez votre code en deux fichiers :

  • formatters.dart : Créez deux classes appelables qui transforment des chaînes de caractères :
    • Une classe Wrapper qui enveloppe le texte avec un préfixe et un suffixe configurables. Elle doit stocker des chaînes prefix et suffix, et sa méthode call() doit accepter un String text et renvoyer le texte enveloppé par le préfixe et le suffixe.
    • Une classe Repeater qui répète le texte un nombre de fois configurable. Elle doit stocker un entier times, et sa méthode call() doit accepter un String text et renvoyer le texte répété ce nombre de fois, séparé par des espaces.
  • main.dart : Importez vos formateurs et démontrez comment ces objets peuvent être utilisés exactement comme des fonctions :
    • Créez un Wrapper avec le préfixe '[' et le suffixe ']'
    • Créez un autre Wrapper avec le préfixe '***' et le suffixe '***'
    • Créez un Repeater avec times défini sur 3
    • Appelez le premier wrapper avec 'Hello' et affichez le résultat
    • Appelez le deuxième wrapper avec 'Important' et affichez le résultat
    • Appelez le repeater avec 'Go' et affichez le résultat
    • Démontrez le chaînage en passant le résultat du premier wrapper (avec 'Nested') dans le deuxième wrapper, et affichez le résultat

Remarquez comment vous pouvez appeler vos objets formateurs directement en utilisant des parenthèses, tout comme des fonctions ordinaires. La méthode call() rend cela possible, et chaque objet se souvient de sa configuration entre les utilisations !

Sortie attendue :

[Hello]
***Important***
Go Go Go
***[Nested]***

Aide-mémoire

La méthode call() vous permet d'utiliser un objet comme s'il s'agissait d'une fonction. Lorsqu'une classe définit une méthode call(), vous pouvez invoquer les instances de cette classe en utilisant la syntaxe d'appel de fonction.

class Multiplier {
  int factor;
  
  Multiplier(this.factor);
  
  int call(int value) {
    return value * factor;
  }
}

void main() {
  var double = Multiplier(2);
  print(double(5));  // 10 - appel de l'objet comme une fonction
}

Au lieu d'écrire double.call(5), vous pouvez simplement écrire double(5). Dart invoque automatiquement la méthode call() lorsque vous utilisez des parenthèses sur l'objet.

La méthode call() peut accepter n'importe quels paramètres et retourner n'importe quel type :

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?
}

Ce modèle est utile pour créer des objets qui se comportent comme des fonctions tout en conservant un état ou une configuration entre les appels.

Essayez vous-même

import 'formatters.dart';

void main() {
  // TODO: Créer un Wrapper avec le préfixe '[' et le suffixe ']'
  
  // TODO: Créer un autre Wrapper avec le préfixe '***' et le suffixe '***'
  
  // TODO: Créer un Repeater avec times défini à 3
  
  // TODO: Appeler le premier wrapper avec 'Hello' et afficher le résultat
  
  // TODO: Appeler le deuxième wrapper avec 'Important' et afficher le résultat
  
  // TODO: Appeler le repeater avec 'Go' et afficher le résultat
  
  // TODO: Démontrer le chaînage en passant le résultat du premier wrapper
  // (avec 'Nested') dans le deuxième wrapper, et afficher le résultat
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation Orientée Objet