Menu
Coddy logo textTech

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.

challenge icon

Défi

Facile

Construisons 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 Media avec une propriété String title, un constructeur qui reçoit le titre et une méthode play() qui affiche Playing: [title]
    • Une classe Song qui étend Media et ajoute une propriété String artist. Utilise l’annotation @override et redéfinis play() pour afficher Playing song: [title] by [artist]
    • Une classe Video qui étend Media et ajoute une propriété int duration (en secondes). Utilise @override et redéfinis play() pour appeler d’abord la version du parent avec super.play(), puis afficher Duration: [duration] seconds
  • main.dart : importe ton fichier multimédia et démontre les méthodes redéfinies :
    • Crée un objet Media avec le titre 'Generic Content' et appelle play()
    • Affiche une ligne vide
    • Crée un Song avec le titre 'Imagine' et l’artiste 'John Lennon', puis appelle play()
    • Affiche une ligne vide
    • Crée un Video avec le titre 'Dart Tutorial' et une durée de 360, puis appelle play()

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 seconds

Essayez 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()
  
}
quiz iconTestez-vous

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

Entraînez-vous par vous-même : Compilateur Dart en ligne