Classes appelables
Fait partie de la section Programmation Orientée Objet du Journey Dart de Coddy. Leçon 84 sur 110.
En Dart, vous pouvez rendre les instances d’une classe appelables comme des fonctions en implémentant la méthode call(). Cela vous permet d’utiliser un objet avec la syntaxe d’appel de fonction, en utilisant directement des parenthèses sur l’instance.
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 - appeler l'objet comme une fonction
print(triple(5)); // 15
}Lorsque vous écrivez double(5), Dart invoque automatiquement la méthode call() avec 5 comme argument. L’objet se comporte comme une fonction tout en conservant son état (le champ factor).
La méthode call() peut avoir n’importe quelle signature : plusieurs paramètres, des paramètres facultatifs, ou même retourner des types différents :
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')); // Bonjour, Alice !
print(hello('Bob', punctuation: '.')); // Bonjour, Bob.
}Les classes appelables sont utiles lorsque vous avez besoin d’un comportement semblable à celui d’une fonction, associé à un état ou à une configuration. Elles sont couramment utilisées pour créer des opérations, des validateurs ou des transformations réutilisables qui doivent conserver des paramètres entre les appels.
Défi
FacileConstruisons un système de formatage de texte à l'aide de classes appelables ! Vous créerez des objets qui peuvent être appelés comme des fonctions pour transformer du texte de différentes manières, tout en conservant leurs propres paramètres de configuration.
Vous organiserez votre code dans deux fichiers :
formatters.dart: créez deux classes appelables qui transforment le texte :- Une classe
Wrapperqui entoure le texte d'un préfixe et d'un suffixe. Elle doit stocker unString prefixet unString suffixet, lorsqu'elle est appelée avec un paramètreString text, renvoyer le texte entouré du préfixe et du suffixe. - Une classe
Repeaterqui répète le texte un certain nombre de fois. Elle doit stocker une valeurint timeset, lorsqu'elle est appelée avec un paramètreString text, renvoyer le texte répété ce nombre de fois, avec un espace entre chaque répétition.
- Une classe
main.dart: importez vos formateurs et montrez comment fonctionnent les classes appelables :- Créez un
Wrapperavec le préfixe"["et le suffixe"]" - Créez un autre
Wrapperavec le préfixe"***"et le suffixe"***" - Créez un
Repeaterqui répète 3 fois - 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 répéteur avec
"Go"et affichez le résultat - Enfin, combinez-les : appelez le premier wrapper avec le résultat de l'appel du répéteur avec
"Dart", puis affichez le résultat
- Créez un
Remarquez comment chaque objet formateur mémorise sa configuration et peut être appelé directement avec des parenthèses, exactement comme une fonction !
Résultat attendu :
[Hello]
***Important***
Go Go Go
[Dart Dart Dart]Essayez vous-même
import 'formatters.dart';
void main() {
// TODO: Créez un Wrapper avec le préfixe "[" et le suffixe "]"
// TODO: Créez un autre Wrapper avec le préfixe "***" et le suffixe "***"
// TODO: Créez un Repeater qui répète 3 fois
// TODO: Appelez le premier wrapper avec "Hello" et affichez le résultat
// TODO: Appelez le second wrapper avec "Important" et affichez le résultat
// TODO: Appelez le repeater avec "Go" et affichez le résultat
// TODO: Combinez-les : appelez le premier wrapper avec le résultat de
// l'appel du repeater avec "Dart", et affichez 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érique13Concepts avancés de la POO
Composition ou héritageMéthodes d’extensionClasses appelablesClasses scellées (Dart 3)Enregistrements (Dart 3)Patterns et correspondance (3.0)Énumérations avec méthodes2Constructeurs 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