Interfaces multiples
Fait partie de la section Programmation Orientée Objet du Journey Dart de Coddy — leçon 48 sur 110.
L'un des plus grands avantages des interfaces par rapport à l'héritage est qu'une classe peut implémenter plusieurs interfaces. Alors que Dart vous limite à l'extension d'une seule classe, vous pouvez implémenter autant d'interfaces que nécessaire.
abstract class Printable {
void printContent();
}
abstract class Saveable {
void save();
}
abstract class Shareable {
void share(String recipient);
}
class Document implements Printable, Saveable, Shareable {
String content;
Document(this.content);
@override
void printContent() {
print('Printing: $content');
}
@override
void save() {
print('Saving document...');
}
@override
void share(String recipient) {
print('Sharing with $recipient');
}
}Lors de l'implémentation de plusieurs interfaces, vous devez fournir des implémentations pour toutes les méthodes de chaque interface. La classe doit remplir tous les contrats qu'elle s'engage à supporter.
Vous pouvez également combiner extends avec plusieurs clauses implements :
class Report extends Document implements Printable, Shareable {
Report(String content) : super(content);
// Must still implement all interface methods
// (already inherited from Document in this case)
}Cette flexibilité vous permet de concevoir des classes qui s'adaptent à plusieurs rôles. Un SmartPhone pourrait implémenter les interfaces Camera, Phone et MusicPlayer, promettant qu'il peut faire tout ce que chaque interface requiert tout en conservant sa propre implémentation unique.
Défi
FacileConstruisons un système d'appareils intelligents qui démontre comment une seule classe peut implémenter plusieurs interfaces pour combiner différentes capacités. Vous allez créer des classes d'interface distinctes pour les différentes fonctionnalités de l'appareil, puis construire un appareil capable de tout faire.
Vous organiserez votre code en deux fichiers :
devices.dart: Définissez vos interfaces et la classe d'implémentation ici :- Une classe
Connectableavec une méthodeconnect()qui afficheConnecting to network... - Une classe
Chargeableavec une méthodecharge()qui afficheCharging battery... - Une classe
Displayableavec une méthodeshowScreen(String content)qui afficheDisplaying: [content] - Une classe
Tabletqui implémente les trois interfaces :Connectable,Chargeable, etDisplayable. Ajoutez une propriétéString brandavec un constructeur. Vos implémentations doivent afficher[brand] tablet connecting to WiFipour connect,[brand] tablet charging via USB-Cpour charge, et[brand] screen: [content]pour showScreen
- Une classe
main.dart: Importez votre fichier d'appareils et démontrez comment la Tablet remplit les trois contrats d'interface :- Créez une
Tabletavec la marque'Galaxy' - Appelez
connect() - Appelez
charge() - Appelez
showScreen('Welcome Home')
- Créez une
Votre classe Tablet doit fournir sa propre implémentation pour chaque méthode des trois interfaces. Cela montre comment l'implémentation de plusieurs interfaces permet à une seule classe de promettre plusieurs capacités tout en gardant chaque implémentation unique à l'appareil.
Sortie attendue :
Galaxy tablet connecting to WiFi
Galaxy tablet charging via USB-C
Galaxy screen: Welcome HomeAide-mémoire
Une classe peut implémenter plusieurs interfaces en les listant après le mot-clé implements, séparées par des virgules :
abstract class Printable {
void printContent();
}
abstract class Saveable {
void save();
}
class Document implements Printable, Saveable {
@override
void printContent() {
print('Printing...');
}
@override
void save() {
print('Saving...');
}
}Lors de l'implémentation de plusieurs interfaces, vous devez fournir des implémentations pour toutes les méthodes de chaque interface.
Vous pouvez combiner extends avec plusieurs implements :
class Report extends Document implements Printable, Shareable {
Report(String content) : super(content);
// Doit implémenter toutes les méthodes de l'interface
}Cela permet à une classe de remplir plusieurs contrats et d'assumer plusieurs rôles simultanément.
Essayez vous-même
import 'devices.dart';
void main() {
// TODO: Créer une Tablet avec la marque 'Galaxy'
// TODO: Appeler connect()
// TODO: Appeler charge()
// TODO: Appeler showScreen('Welcome Home')
}
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
1Les bases de la POO
Fichiers externesBibliothèques et importsIntroduction à la POOClasses vs ObjetsLe mot-clé thisMéthodesVariables d'instanceBases des constructeursRécapitulatif - Calculatrice simple4Null Safety
Introduction à la Null SafetyNullable vs Non-NullableLes opérateurs ? et !Le mot-clé late et la Null SafetyLes opérateurs Null-AwareLa Null Safety dans les classesRécapitulatif - Système de profil utilisateur7Classes abstraites et Interfaces
Classes abstraitesMéthodes abstraitesInterfaces en DartInterfaces implicitesImplémentation vs ExtensionInterfaces multiplesRécapitulatif - Calculateur de formes10Collections et Génériques
Aperçu des List, Set et MapCollections Type-SafeClasses génériquesMéthodes génériquesContraintes de généricitéIterable & IteratorRécapitulatif - Stockage générique2Les constructeurs en Dart
Constructeur par défautConstructeurs nommésListes d'initialisationConstructeurs constantsConstructeurs factoryConstructeurs de redirectionRécapitulatif - Shape Builder5Encapsulation
Membres publics vs privésLa convention du préfixe _Visibilité au niveau de la bibliothèqueApprofondissement des Getters & SettersMasquage d'informationsRécapitulatif - Dossiers d'étudiants8Mixins
Introduction aux MixinsCréation de MixinsUtilisation de plusieurs MixinsLe mot-clé on dans les MixinsMixin vs HéritageMixin vs InterfaceRécapitulatif - Système Animal11Méthodes spéciales
Redéfinition de toString()Redéfinition de hashCode & ==Interface ComparableMéthode call()Redéfinition de noSuchMethodRécapitulatif - Collection personnalisée14Patrons de conception Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FabriquePatron ObservateurPatron Stratégie3Propriétés de classe
Membres d'instance vs statiquesChamps Final & ConstVariables LateMéthodes et champs statiquesGetters et SettersRécapitulatif - Gestionnaire de compte bancaire6Héritage
Bases de l'héritageLe mot-clé superRedéfinition de méthodeL'annotation @overrideLe mot-clé final pour les classesConstructeurs et héritageRécapitulatif - Hiérarchie des employés9Polymorphisme
Bases du polymorphismePolymorphisme via les interfacesVérification de type à l'exécutionLes opérateurs is & asMot-clé covariantRécapitulatif - Processeur de paiement12POO Asynchrone
Futures & async/awaitBases des StreamsStream ControllersConstructeurs asynchronesL'asynchrone dans les méthodes de classeRécapitulatif - Data Fetcher15Patrons de conception Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode ModèlePatron ÉtatPatron CompositePatron Repository