Redéfinition de méthode
Fait partie de la section Programmation Orientée Objet du Journey Dart de Coddy. Leçon 38 sur 110.
La redéfinition de méthode se produit lorsqu’une classe enfant fournit sa propre implémentation d’une méthode qui existe déjà dans la classe parente. Cela permet aux sous-classes de personnaliser le comportement hérité tout en conservant la même signature de méthode.
Lorsque vous définissez une méthode dans une classe enfant avec le même nom et les mêmes paramètres que dans la classe parente, la version de la classe enfant remplace celle-ci :
class Animal {
String name;
Animal(this.name);
void speak() {
print('$name makes a sound');
}
}
class Dog extends Animal {
Dog(String name) : super(name);
void speak() {
print('$name barks: Woof!');
}
}
void main() {
var animal = Animal('Generic');
var dog = Dog('Buddy');
animal.speak(); // Generic fait un son
dog.speak(); // Buddy aboie : Woof!
}Lorsque tu appelles speak() sur une instance de Dog, Dart exécute la version de Dog, et non celle de Animal. La classe enfant a redéfini la méthode de la classe parent.
Vous pouvez également combiner la redéfinition avec super pour étendre plutôt que remplacer le comportement du parent :
class Cat extends Animal {
Cat(String name) : super(name);
void speak() {
super.speak(); // Appeler d'abord la version du parent
print('$name also purrs');
}
}Ce modèle vous permet de vous appuyer sur des fonctionnalités existantes. La règle essentielle est simple : dans la classe enfant, une méthode portant le même nom et ayant les mêmes paramètres remplace l’implémentation de la classe parente lorsqu’elle est appelée sur des instances de la classe enfant.
Défi
FacileConstruisons un système de notifications qui montre comment les classes enfants peuvent remplacer les méthodes parentes pour personnaliser le comportement. Vous créerez différents types de notifications qui transmettront chacun les messages à leur propre manière.
Vous organiserez votre code en deux fichiers :
notification.dart: Définissez ici votre hiérarchie de notifications :- Une classe
Notification(la classe parente) avec unString titleet unString message. Incluez un constructeur qui accepte les deux valeurs ainsi qu’une méthodesend()qui afficheNotification: [title] - [message] - Une classe
EmailNotificationqui étendNotificationet ajoute une propriétéString recipient. Remplacez la méthodesend()pour afficherSending email to [recipient]: [title] - [message] - Une classe
PushNotificationqui étendNotificationet ajoute une propriétéString deviceId. Remplacez la méthodesend()pour appeler d’abord la méthodesend()de la classe parente à l’aide desuper, puis afficherPushed to device: [deviceId]à la ligne suivante
- Une classe
main.dart: Importez votre fichier de notifications et démontrez le remplacement de méthode en action :- Créez une
Notificationde base avec le titre'Alert'et le message'System update available' - Appelez sa méthode
send() - Affichez une ligne vide
- Créez une
EmailNotificationavec le titre'Welcome', le message'Thanks for signing up!'et le destinataire'user@example.com' - Appelez sa méthode
send() - Affichez une ligne vide
- Créez une
PushNotificationavec le titre'Reminder', le message'Meeting in 10 minutes'et le deviceId'DEVICE-001' - Appelez sa méthode
send()
- Créez une
Remarquez comment EmailNotification remplace complètement le comportement de la classe parente, tandis que PushNotification l’étend en appelant d’abord super.send(). Les deux approches sont valides pour remplacer des méthodes, selon vos besoins.
Sortie attendue :
Notification: Alert - System update available
Sending email to user@example.com: Welcome - Thanks for signing up!
Notification: Reminder - Meeting in 10 minutes
Pushed to device: DEVICE-001Essayez vous-même
import 'notification.dart';
void main() {
// TODO: Create a base Notification with title 'Alert' and message 'System update available'
// Appelez sa méthode send()
// TODO: Affichez une ligne vide
// TODO: Créez une EmailNotification avec :
// - title: 'Welcome'
// - message: 'Thanks for signing up!'
// - recipient: 'user@example.com'
// Appelez sa méthode send()
// TODO: Affichez une ligne vide
// TODO: Créez une PushNotification avec :
// - title: 'Reminder'
// - message: 'Meeting in 10 minutes'
// - deviceId: 'DEVICE-001'
// Appelez sa méthode send()
}
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