Menu
Coddy logo textTech

Interfaces en Dart

Fait partie de la section Programmation Orientée Objet du Journey Dart de Coddy. Leçon 45 sur 110.

Contrairement à de nombreux langages qui disposent d’un mot-clé interface dédié, Dart adopte une approche différente. En Dart, chaque classe définit automatiquement une interface. Cette interface comprend tous les membres publics (méthodes et propriétés) que la classe déclare.

Lorsque vous voulez qu'une classe promette de fournir certaines fonctionnalités sans hériter de l'implémentation, vous utilisez le mot-clé implements :

class Printer {
  void printDocument(String content) {
    print('Printing: $content');
  }
}

class Scanner {
  void scan() {
    print('Scanning document');
  }
}

// MultiFunctionDevice doit implémenter TOUTES les méthodes des deux classes
class MultiFunctionDevice implements Printer, Scanner {
  @override
  void printDocument(String content) {
    print('MFD printing: $content');
  }
  
  @override
  void scan() {
    print('MFD scanning');
  }
}

La différence essentielle avec extends est que implements n’hérite d’aucun code. Tu dois fournir ta propre implémentation pour chaque méthode et propriété définie dans l’interface. Il s’agit d’un contrat : tu promets que ta classe possédera ces capacités, mais c’est toi qui décides exactement de leur fonctionnement.

Cette approche confère de la flexibilité à Dart. Vous pouvez utiliser des classes abstraites lorsque vous souhaitez définir des interfaces sans implémentation, ou utiliser des classes ordinaires comme interfaces lorsque cela est pertinent. La prochaine leçon explore plus en détail le fonctionnement de ce concept d’« interface implicite ».

challenge icon

Défi

Facile

Construisons un système de lecteur multimédia qui montre comment fonctionne le mot-clé implements en Dart. Tu vas créer des classes qui servent d’interfaces, puis les implémenter dans un seul appareil qui combine plusieurs fonctionnalités.

Tu organiseras ton code en deux fichiers :

  • media.dart : définis ici tes classes d’interface et la classe qui les implémente :
    • Une classe AudioPlayer avec une méthode playAudio(String track) qui affiche Playing audio: [track]
    • Une classe VideoPlayer avec une méthode playVideo(String title) qui affiche Playing video: [title]
    • Une classe SmartTV qui implémente à la fois AudioPlayer et VideoPlayer. Comme implements n’hérite d’aucun code, tu dois fournir tes propres implémentations pour les deux méthodes. Ton SmartTV doit afficher SmartTV audio: [track] pour l’audio et SmartTV video: [title] pour la vidéo
  • main.dart : importe ton fichier media et montre comment une seule classe peut implémenter plusieurs interfaces :
    • Crée une instance de SmartTV
    • Appelle playAudio('Jazz Collection')
    • Appelle playVideo('Nature Documentary')

Remarque que SmartTV doit fournir sa propre implémentation pour chaque méthode des deux interfaces : elle n’hérite pas des implémentations d’origine de AudioPlayer ou VideoPlayer. C’est la différence essentielle entre implements et extends.

Sortie attendue :

SmartTV audio: Jazz Collection
SmartTV video: Nature Documentary

Essayez vous-même

import 'media.dart';

void main() {
  // TODO : Créer une instance de SmartTV
  
  // TODO : Appeler playAudio('Jazz Collection')
  
  // TODO : Appeler playVideo('Nature Documentary')
  
}
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