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 possèdent un mot-clé interface dédié, Dart adopte une approche différente. En Dart, chaque classe définit automatiquement une interface. Cette interface se compose de 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 clé par rapport à extends est que implements n'hérite d'aucun code. Vous devez fournir votre propre implémentation pour chaque méthode et propriété définie dans l'interface. C'est un contrat : vous promettez que votre classe aura ces capacités, mais vous décidez exactement de la manière dont elles fonctionnent.

Cette approche donne de la flexibilité à Dart. Vous pouvez utiliser des classes abstraites lorsque vous souhaitez définir des interfaces sans implémentation, ou utiliser des classes régulières comme interfaces lorsque cela est pertinent. La leçon suivante 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 démontre le fonctionnement du mot-clé implements en Dart. Vous allez créer des classes qui servent d'interfaces, puis les implémenter dans un seul appareil combinant plusieurs capacités.

Vous organiserez votre code en deux fichiers :

  • media.dart : Définissez vos classes d'interface et la classe d'implémentation ici :
    • 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. Puisque implements n'hérite d'aucun code, vous devez fournir vos propres implémentations pour les deux méthodes. Votre SmartTV doit afficher SmartTV audio: [track] pour l'audio et SmartTV video: [title] pour la vidéo
  • main.dart : Importez votre fichier multimédia et démontrez comment une seule classe peut implémenter plusieurs interfaces :
    • Créez une instance de SmartTV
    • Appelez playAudio('Jazz Collection')
    • Appelez playVideo('Nature Documentary')

Remarquez comment SmartTV doit fournir sa propre implémentation pour chaque méthode des deux interfaces - elle n'hérite pas des implémentations originales de AudioPlayer ou VideoPlayer. C'est la différence fondamentale entre implements et extends.

Sortie attendue :

SmartTV audio: Jazz Collection
SmartTV video: Nature Documentary

Aide-mémoire

En Dart, chaque classe définit automatiquement une interface composée de tous ses membres publics. Pour implémenter une interface sans hériter du code, utilisez le mot-clé implements :

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

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

// Must implement ALL methods from both classes
class MultiFunctionDevice implements Printer, Scanner {
  @override
  void printDocument(String content) {
    print('MFD printing: $content');
  }
  
  @override
  void scan() {
    print('MFD scanning');
  }
}

Différences clés par rapport à extends :

  • implements n'hérite d'aucune implémentation de code
  • Vous devez fournir votre propre implémentation pour chaque méthode et propriété
  • Une classe peut implémenter plusieurs interfaces
  • C'est un contrat promettant que votre classe possédera ces capacités

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