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.
Défi
FacileConstruisons 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
Wrapperqui enveloppe le texte avec un préfixe et un suffixe configurables. Elle doit stocker des chaînesprefixetsuffix, et sa méthodecall()doit accepter unString textet renvoyer le texte enveloppé par le préfixe et le suffixe. - Une classe
Repeaterqui répète le texte un nombre de fois configurable. Elle doit stocker un entiertimes, et sa méthodecall()doit accepter unString textet renvoyer le texte répété ce nombre de fois, séparé par des espaces.
- Une classe
main.dart: Importez vos formateurs et démontrez comment ces objets peuvent être utilisés exactement comme des fonctions :- Créez un
Wrapperavec le préfixe'['et le suffixe']' - Créez un autre
Wrapperavec le préfixe'***'et le suffixe'***' - Créez un
Repeateravectimesdéfini sur3 - 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
- Créez un
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
}
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
1Les bases de la POO
Fichiers externesBibliothèques et importsIntroduction à la POOClasses vs ObjetsLe mot-clé thisMéthodesVariables d'instanceBases des constructeursRécapitulatif - Calculatrice simple4Null Safety
Introduction à la Null SafetyNullable vs Non-NullableLes opérateurs ? et !Le mot-clé late et la Null SafetyLes opérateurs Null-AwareLa Null Safety dans les classesRécapitulatif - Système de profil utilisateur7Classes abstraites et Interfaces
Classes abstraitesMéthodes abstraitesInterfaces en DartInterfaces implicitesImplémentation vs ExtensionInterfaces multiplesRécapitulatif - Calculateur de formes10Collections et Génériques
Aperçu des List, Set et MapCollections Type-SafeClasses génériquesMéthodes génériquesContraintes de généricitéIterable & IteratorRécapitulatif - Stockage générique2Les constructeurs en Dart
Constructeur par défautConstructeurs nommésListes d'initialisationConstructeurs constantsConstructeurs factoryConstructeurs de redirectionRécapitulatif - Shape Builder5Encapsulation
Membres publics vs privésLa convention du préfixe _Visibilité au niveau de la bibliothèqueApprofondissement des Getters & SettersMasquage d'informationsRécapitulatif - Dossiers d'étudiants8Mixins
Introduction aux MixinsCréation de MixinsUtilisation de plusieurs MixinsLe mot-clé on dans les MixinsMixin vs HéritageMixin vs InterfaceRécapitulatif - Système Animal11Méthodes spéciales
Redéfinition de toString()Redéfinition de hashCode & ==Interface ComparableMéthode call()Redéfinition de noSuchMethodRécapitulatif - Collection personnalisée14Patrons de conception Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FabriquePatron ObservateurPatron Stratégie3Propriétés de classe
Membres d'instance vs statiquesChamps Final & ConstVariables LateMéthodes et champs statiquesGetters et SettersRécapitulatif - Gestionnaire de compte bancaire6Héritage
Bases de l'héritageLe mot-clé superRedéfinition de méthodeL'annotation @overrideLe mot-clé final pour les classesConstructeurs et héritageRécapitulatif - Hiérarchie des employés9Polymorphisme
Bases du polymorphismePolymorphisme via les interfacesVérification de type à l'exécutionLes opérateurs is & asMot-clé covariantRécapitulatif - Processeur de paiement12POO Asynchrone
Futures & async/awaitBases des StreamsStream ControllersConstructeurs asynchronesL'asynchrone dans les méthodes de classeRécapitulatif - Data Fetcher15Patrons de conception Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode ModèlePatron ÉtatPatron CompositePatron Repository