L’annotation @override
Fait partie de la section Programmation Orientée Objet du Journey Dart de Coddy. Leçon 39 sur 110.
L’annotation @override est un marqueur de bonne pratique qui indique à Dart (et aux autres développeurs) que tu remplaces intentionnellement une méthode d’une classe parente. Bien que la redéfinition de méthode fonctionne sans elle, l’utilisation de @override ajoute un filet de sécurité important.
class Animal {
String name;
Animal(this.name);
void speak() {
print('$name makes a sound');
}
}
class Dog extends Animal {
Dog(String name) : super(name);
@override
void speak() {
print('$name barks: Woof!');
}
}L’annotation offre deux avantages essentiels. Premièrement, elle documente clairement votre intention : toute personne lisant le code sait immédiatement que cette method existe dans la parent class. Deuxièmement, l’analyseur de Dart vous avertira si la method du parent n’existe pas réellement, ce qui permet de détecter rapidement les fautes de frappe et les erreurs de refactorisation.
Considérez ce qui se passe si vous orthographiez mal le nom de la méthode sans @override :
class Cat extends Animal {
Cat(String name) : super(name);
void speek() { // Typo ! Aucun avertissement sans @override
print('$name meows');
}
}Sans l’annotation, Dart suppose que vous créez une nouvelle méthode appelée speek(). Avec @override, l’analyseur signalerait immédiatement qu’aucune méthode de ce type n’existe dans la classe parente. Cette simple annotation évite des bogues subtils qui peuvent être difficiles à détecter ultérieurement.
Défi
FacileConstruisons un système de lecteur multimédia qui illustre l’importance de l’annotation @override lors de la personnalisation d’un comportement hérité. Tu vas créer différents types de médias, chacun lisant le contenu à sa manière.
Tu organiseras ton code en deux fichiers :
media.dart: définis ici ta hiérarchie de médias :- Une classe
Mediaavec une propriétéString title, un constructeur qui reçoit le titre et une méthodeplay()qui affichePlaying: [title] - Une classe
Songqui étendMediaet ajoute une propriétéString artist. Utilise l’annotation@overrideet redéfinisplay()pour afficherPlaying song: [title] by [artist] - Une classe
Videoqui étendMediaet ajoute une propriétéint duration(en secondes). Utilise@overrideet redéfinisplay()pour appeler d’abord la version du parent avecsuper.play(), puis afficherDuration: [duration] seconds
- Une classe
main.dart: importe ton fichier multimédia et démontre les méthodes redéfinies :- Crée un objet
Mediaavec le titre'Generic Content'et appelleplay() - Affiche une ligne vide
- Crée un
Songavec le titre'Imagine'et l’artiste'John Lennon', puis appelleplay() - Affiche une ligne vide
- Crée un
Videoavec le titre'Dart Tutorial'et une durée de360, puis appelleplay()
- Crée un objet
L’annotation @override documente ton intention et aide à détecter les erreurs. Si tu écrivais accidentellement plya() au lieu de play(), l’annotation t’avertirait qu’aucune méthode de ce type n’existe dans la classe parent.
Sortie attendue :
Playing: Generic Content
Playing song: Imagine by John Lennon
Playing: Dart Tutorial
Duration: 360 secondsEssayez vous-même
import 'media.dart';
void main() {
// TODO: Create a Media object with title 'Generic Content' and call play()
// TODO: Affiche une ligne vide
// TODO: Crée un Song avec le titre 'Imagine' et l'artiste 'John Lennon', puis appelle play()
// TODO: Affiche une ligne vide
// TODO: Create a Video with title 'Dart Tutorial' and duration 360, then call play()
}
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