Redéfinition de toString()
Fait partie de la section Programmation Orientée Objet du Journey Dart de Coddy — leçon 70 sur 110.
Lorsque vous affichez un objet en Dart, vous pourriez voir quelque chose comme Instance of 'Person' - ce qui n'est pas très utile. Cela se produit parce que chaque classe hérite d'une méthode toString() par défaut de Object qui ne renvoie que le nom de la classe.
En redéfinissant toString(), vous pouvez fournir une représentation textuelle significative de vos objets :
class Person {
String name;
int age;
Person(this.name, this.age);
@override
String toString() {
return 'Person(name: $name, age: $age)';
}
}
void main() {
var person = Person('Alice', 30);
print(person); // Person(name: Alice, 30)
}Sans la redéfinition, print(person) afficherait Instance of 'Person'. Grâce à elle, vous obtenez des informations utiles sur l'état de l'objet.
La méthode toString() est appelée automatiquement chaque fois que Dart a besoin de convertir votre objet en une chaîne de caractères - dans les instructions print(), l'interpolation de chaînes, ou lors de la concaténation avec d'autres chaînes :
var message = 'User: $person'; // toString() appelée automatiquement
print('Found: ' + person.toString()); // Appel expliciteUn toString() bien implémenté facilite grandement le débogage en vous permettant d'inspecter rapidement les valeurs des objets pendant le développement.
Défi
FacileConstruisons un système de catalogue de produits où chaque produit affiche ses informations dans un format propre et lisible lorsqu'il est imprimé. Vous allez vous entraîner à redéfinir la méthode toString() pour rendre vos objets plus faciles à déboguer et plus conviviaux.
Vous organiserez votre code en deux fichiers :
product.dart: Créez une classeProductqui représente un article dans un magasin. Votre produit doit avoir unname(String), unprice(double) et unequantity(int). Redéfinissez la méthodetoString()pour retourner une chaîne formatée exactement selon ce format :Product(name: [name], price: $[price], qty: [quantity])main.dart: Importez votre fichier de produit et démontrez comment la redéfinition detoString()rend l'impression d'objets beaucoup plus utile. Créez trois produits et imprimez-les pour voir votre représentation textuelle personnalisée en action :- Un produit nommé
'Laptop'avec le prix999.99et la quantité5 - Un produit nommé
'Mouse'avec le prix29.5et la quantité50 - Un produit nommé
'Keyboard'avec le prix75.0et la quantité30
Featured: [product]en utilisant le produit Laptop.- Un produit nommé
Remarquez comment l'impression directe de chaque produit affiche des informations significatives au lieu du message peu utile Instance of 'Product'. Votre méthode toString() est appelée automatiquement à la fois dans les instructions print() et lors de l'utilisation de l'interpolation de chaîne.
Sortie attendue :
Product(name: Laptop, price: $999.99, qty: 5)
Product(name: Mouse, price: $29.5, qty: 50)
Product(name: Keyboard, price: $75.0, qty: 30)
Featured: Product(name: Laptop, price: $999.99, qty: 5)Aide-mémoire
Par défaut, l'affichage d'un objet en Dart affiche Instance of 'ClassName'. Surchargez la méthode toString() pour fournir des représentations textuelles significatives :
class Person {
String name;
int age;
Person(this.name, this.age);
@override
String toString() {
return 'Person(name: $name, age: $age)';
}
}La méthode toString() est appelée automatiquement dans les instructions print() et l'interpolation de chaînes :
var person = Person('Alice', 30);
print(person); // Person(name: Alice, age: 30)
var message = 'User: $person'; // toString() appelée automatiquementEssayez vous-même
import 'product.dart';
void main() {
// TODO: Créer trois instances de Product :
// 1. Laptop - price: 999.99, quantity: 5
// 2. Mouse - price: 29.5, quantity: 50
// 3. Keyboard - price: 75.0, quantity: 30
// TODO: Afficher chaque produit (toString() sera appelé automatiquement)
// TODO: Afficher un message de mise en avant en utilisant l'interpolation de chaîne
// Format: Featured: [laptop product]
}
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