Menu
Coddy logo textTech

Interfaces implicites

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

Puisque chaque classe Dart définit automatiquement une interface, vous pouvez utiliser n'importe quelle classe comme une interface - même des classes concrètes avec des implémentations complètes. C'est ce que nous appelons une interface implicite.

Considérez une classe avec des propriétés et des méthodes :

class Logger {
  String prefix = '[LOG]';
  
  void log(String message) {
    print('$prefix $message');
  }
  
  void clear() {
    print('Clearing logs...');
  }
}

Lorsqu'une autre classe implémente Logger, elle doit fournir sa propre implémentation pour tout - y compris la propriété prefix :

class FileLogger implements Logger {
  @override
  String prefix = '[FILE]';
  
  @override
  void log(String message) {
    print('$prefix Writing to file: $message');
  }
  
  @override
  void clear() {
    print('Deleting log file...');
  }
}

C'est l'idée clé : lorsque vous utilisez implements, vous dites « ma classe aura la même forme » — les mêmes méthodes et propriétés. Vous n'héritez d'aucun code, constructeur ou valeur par défaut. Vous promettez seulement de respecter la structure de l'interface.

Cela rend les interfaces implicites puissantes pour la création de composants interchangeables. Le code qui attend un Logger peut fonctionner avec n'importe quelle classe qui implémente son interface, quelle que soit la manière dont cette implémentation fonctionne en interne.

challenge icon

Défi

Facile

Construisons un système de notifications qui montre comment des classes concrètes peuvent servir d’interfaces implicites. Vous allez créer une classe de base pour les notifications, puis l’implémenter d’une manière complètement différente, afin de montrer que implements vous oblige à fournir vous-même tous les membres.

Vous allez organiser votre code en deux fichiers :

  • notification.dart : définissez ici vos classes de notification :
    • Une classe Notification avec une propriété String channel définie sur 'default', une méthode send(String message) qui affiche [channel]: [message], et une méthode getStatus() qui renvoie la chaîne 'Notification ready'
    • Une classe EmailNotification qui implémente Notification. Comme vous utilisez implements, vous devez fournir votre propre propriété channel (définissez-la sur 'email'), votre propre méthode send() qui affiche Sending email: [message], ainsi que votre propre méthode getStatus() qui renvoie 'Email service active'
    • Une classe PushNotification qui implémente Notification. Définissez sa propriété channel sur 'push', faites en sorte que send() affiche Push alert: [message], et faites en sorte que getStatus() renvoie 'Push service connected'
  • main.dart : importez votre fichier de notifications et montrez comment différentes classes peuvent implémenter la même interface implicite avec des comportements complètement différents :
    • Créez une instance de EmailNotification et une instance de PushNotification
    • Pour chaque notification, affichez son état à l’aide de getStatus(), puis appelez send() avec le message 'Hello World'
    • Affichez une ligne vide entre les deux notifications

Souvenez-vous : lorsque vous utilisez implements, vous n’héritez d’aucun code de Notification. Vous promettez seulement que votre classe aura la même structure : les mêmes propriétés et méthodes. Chaque classe implémentée fournit sa propre implémentation complète.

Sortie attendue :

Email service active
Sending email: Hello World

Push service connected
Push alert: Hello World

Essayez vous-même

import 'notification.dart';

void main() {
  // TODO: Créer une instance de EmailNotification
  
  // TODO: Afficher le statut de la notification par e-mail en utilisant getStatus()
  
  // TODO: Envoyer un message 'Hello World' en utilisant la notification par e-mail
  
  // TODO: Afficher une ligne vide
  
  // TODO: Créer une instance de PushNotification
  
  // TODO: Afficher le statut de la notification push en utilisant getStatus()
  
  // TODO: Envoyer un message 'Hello World' en utilisant la notification push
  
}
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