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 vous remplacez 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 clés. Premièrement, elle documente clairement votre intention : toute personne lisant le code sait immédiatement que cette méthode existe dans la classe parente. Deuxièmement, l'analyseur de Dart vous avertira si la méthode parente n'existe pas réellement, ce qui permet de détecter tôt 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() {  // Faute de frappe ! Pas d'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'une telle méthode n'existe pas dans la classe parente. Cette simple annotation évite des bugs subtils qui peuvent être difficiles à traquer plus tard.

challenge icon

Défi

Facile

Construisons un système de lecteur multimédia qui démontre l'importance de l'annotation @override lors de la personnalisation d'un comportement hérité. Vous allez créer différents types de médias qui lisent chacun du contenu à leur manière.

Vous organiserez votre code en deux fichiers :

  • media.dart : Définissez votre hiérarchie de médias ici :
    • Une classe Media avec une propriété String title, un constructeur qui prend le titre, et une méthode play() qui affiche Playing: [title]
    • Une classe Song qui étend Media et ajoute une propriété String artist. Utilisez l'annotation @override et surchargez play() pour afficher Playing song: [title] by [artist]
    • Une classe Video qui étend Media et ajoute une propriété int duration (en secondes). Utilisez @override et surchargez play() pour appeler d'abord la version du parent avec super.play(), puis afficher Duration: [duration] seconds
  • main.dart : Importez votre fichier média et démontrez les méthodes surchargées :
    • Créez un objet Media avec le titre 'Generic Content' et appelez play()
    • Affichez une ligne vide
    • Créez un Song avec le titre 'Imagine' et l'artiste 'John Lennon', puis appelez play()
    • Affichez une ligne vide
    • Créez une Video avec le titre 'Dart Tutorial' et la durée 360, puis appelez play()

L'annotation @override documente votre intention et aide à détecter les erreurs. Si vous aviez accidentellement mal orthographié play() en plya(), l'annotation vous avertirait qu'aucune méthode de ce type n'existe dans la classe parente.

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: Créer un objet Media avec le titre 'Generic Content' et appeler play()
  
  
  // TODO: Afficher une ligne vide
  
  
  // TODO: Créer un Song avec le titre 'Imagine' et l'artiste 'John Lennon', puis appeler play()
  
  
  // TODO: Afficher une ligne vide
  
  
  // TODO: Créer un Video avec le titre 'Dart Tutorial' et la durée 360, puis appeler 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