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]***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
1Fondamentaux de la POO
Fichiers externesBibliothèques et importsIntroduction à la POOClasses vs objetsLe mot-clé thisMéthodesVariables d’instanceBases des constructeursRécapitulatif - Calculatrice simple4Sécurité face aux valeurs nulles
Introduction à la sécurité face aux valeurs nullesNullable vs Non-NullableLes opérateurs ? et !Mot-clé Late et sécurité face aux valeurs nullesOpérateurs sensibles à nullSécurité face aux valeurs nulles dans les classesRécapitulatif – Système de profil utilisateur7Classes abstraites et interfaces
Classes abstraitesMéthodes abstraitesInterfaces en DartInterfaces implicitesImplémenter ou étendreInterfaces multiplesRécapitulatif - Calculateur de formes10Collections et génériques
Vue d’ensemble des List, Set et MapCollections à typage sûrClasses génériquesMéthodes génériquesContraintes génériquesIterable et IteratorRécapitulatif – stockage générique2Constructeurs en Dart
Constructeur par défautConstructeurs nommésListes d'initialisationConstructeurs constantsConstructeurs factoryConstructeurs redirigésRécapitulatif - Constructeur de formes5Encapsulation
Membres publics vs privésLa convention du préfixe _Confidentialité au niveau de la bibliothèqueApprofondissement des getters et settersMasquage de l’informationRécapitulatif - Fiches des étudiants8Mixins
Introduction aux MixinsCréer des MixinsUtiliser plusieurs MixinsMot-clé on dans les MixinsMixin ou héritageMixin ou interfaceRécapitulatif - Système animal11Méthodes spéciales
Redéfinition de toString()Redéfinition de hashCode et ==Interface ComparableMéthode call()Redéfinition de noSuchMethodRécapitulatif - Collection personnalisée14Patrons de conception, partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FactoryPatron ObserverPatron Strategy3Propriétés des classes
Membres d’instance et statiquesChamps Final et ConstVariables différéesMéthodes et champs statiquesAccesseurs et mutateursRécapitulatif - Gestionnaire de compte bancaire6Héritage
Héritage de baseLe mot-clé superRedéfinition de méthodeL’annotation @overrideLe mot-clé de classe finalConstructeurs et héritageRécapitulatif – Hiérarchie des employés9Polymorphisme
Bases du polymorphismePolymorphisme via les interfacesVérification des types à l’exécutionLes opérateurs is et asMot-clé covariantRécapitulatif - Processeur de paiements12POO asynchrone
Futures et async/awaitNotions de base des StreamsContrôleurs de StreamsConstructeurs asynchronesAsynchrone dans les méthodes de classeRécapitulatif - récupérateur de données15Patrons de conception – Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode modèlePatron ÉtatPatron CompositePatron DépôtEntraînez-vous par vous-même : Compilateur Dart en ligne