Interfacce multiple
Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 48 di 110.
Uno dei maggiori vantaggi delle interfacce rispetto all'ereditarietà è che una classe può implementare più interfacce. Mentre Dart consente di estendere una sola classe, puoi implementare tutte le interfacce di cui hai bisogno.
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');
}
}Quando implementi più interfacce, devi fornire implementazioni per tutti i metodi di ciascuna interfaccia. La classe deve rispettare tutti i contratti che promette di supportare.
Puoi anche combinare extends con più implements:
class Report extends Document implements Printable, Shareable {
Report(String content) : super(content);
// Deve comunque implementare tutti i metodi delle interfacce
// (in questo caso, già ereditati da Document)
}Questa flessibilità ti permette di progettare classi che si adattano a più ruoli. Uno SmartPhone potrebbe implementare le interfacce Camera, Phone e MusicPlayer, garantendo di poter fare tutto ciò che richiede ciascuna interfaccia, mantenendo al contempo la propria implementazione unica.
Sfida
FacileCostruiamo un sistema di dispositivi intelligenti che dimostri come una singola classe possa implementare più interfacce per combinare diverse funzionalità. Creerai classi di interfaccia separate per le diverse caratteristiche dei dispositivi, poi costruirai un dispositivo in grado di fare tutto.
Organizzerai il codice in due file:
devices.dart: definisci qui le interfacce e la classe che le implementa:- Una classe
Connectablecon un metodoconnect()che stampaConnecting to network... - Una classe
Chargeablecon un metodocharge()che stampaCharging battery... - Una classe
Displayablecon un metodoshowScreen(String content)che stampaDisplaying: [content] - Una classe
Tabletche implementa tutte e tre le interfacce:Connectable,ChargeableeDisplayable. Aggiungi una proprietàString brandcon un costruttore. Le tue implementazioni dovrebbero stampare[brand] tablet connecting to WiFiper connect,[brand] tablet charging via USB-Cper charge e[brand] screen: [content]per showScreen
- Una classe
main.dart: importa il file dei dispositivi e mostra come Tablet soddisfa tutti e tre i contratti delle interfacce:- Crea un
Tabletcon il brand'Galaxy' - Chiama
connect() - Chiama
charge() - Chiama
showScreen('Welcome Home')
- Crea un
La tua classe Tablet deve fornire una propria implementazione per ogni metodo di tutte e tre le interfacce. In questo modo si mostra come implementare più interfacce consenta a una singola classe di garantire più funzionalità, mantenendo ogni implementazione specifica del dispositivo.
Output previsto:
Galaxy tablet connecting to WiFi
Galaxy tablet charging via USB-C
Galaxy screen: Welcome HomeProvalo tu
import 'devices.dart';
void main() {
// TODO: Crea un Tablet di marca 'Galaxy'
// TODO: Chiama connect()
// TODO: Chiama charge()
// TODO: Chiama showScreen('Welcome Home')
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniLibrerie e importazioniIntroduzione alla programmazione orientata agli oggettiClassi e oggettiLa parola chiave thisMetodiVariabili di istanzaFondamenti dei costruttoriRiepilogo - Calcolatrice semplice4Sicurezza dei valori null
Introduzione alla sicurezza dei valori nullNullable e non nullableGli operatori ? e !La keyword late e la sicurezza dei valori nullOperatori null-awareSicurezza dei valori null nelle classiRiepilogo - Sistema di profili utente7Classi astratte e interfacce
Classi astratteMetodi astrattiInterfacce in DartInterfacce impliciteImplementare vs estendereInterfacce multipleRiepilogo - Calcolatore di forme10Collezioni e generici
Panoramica di List, Set e MapCollezioni sicure rispetto ai tipiClassi genericheMetodi genericiVincoli sui genericiIterable e IteratorRiepilogo - Archiviazione generica13Concetti avanzati di OOP
Composizione vs ereditarietàMetodi di estensioneClassi chiamabiliClassi sealed (Dart 3)Record (Dart 3)Pattern e matching (3.0)Enum con metodi16Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente2I costruttori in Dart
Costruttore predefinitoCostruttori con nomeListe di inizializzazioneCostruttori costantiCostruttori factoryCostruttori di reindirizzamentoRiepilogo - Crea forme5Incapsulamento
Membri pubblici e privatiConvenzione del prefisso _Visibilità a livello di libreriaApprofondimento su getter e setterNascondimento delle informazioniRiepilogo - Registri degli studenti8Mixin
Introduzione ai MixinCreare MixinUsare più MixinParola chiave on nei MixinMixin vs ereditarietàMixin vs interfacciaRiepilogo - Sistema animale11Metodi speciali
Sovrascrittura di toString()Sovrascrittura di hashCode e ==Interfaccia ComparableMetodo call()Sovrascrittura di noSuchMethodRiepilogo - Collezione personalizzata14Modelli di progettazione Parte 1
Introduzione ai modelli di progettazioneSingletonFactoryObserverStrategy3Proprietà delle classi
Membri di istanza e staticiCampi final e constVariabili lateMetodi e campi staticiGetter e setterRiepilogo - Gestore di conti bancari6Ereditarietà
Ereditarietà di baseLa parola chiave superOverride dei metodiL’annotazione @overrideLa parola chiave final per le classiCostruttori ed ereditarietàRiepilogo - Gerarchia dei dipendenti9Polimorfismo
Fondamenti di polimorfismoPolimorfismo tramite interfacceControllo del tipo a runtimeGli operatori is e asParola chiave covariantRiepilogo - Elaboratore di pagamenti12OOP asincrona
Future e async/awaitNozioni di base sugli streamController degli streamCostruttori asincroniAsync nei metodi di classeRiepilogo - Recupero dei dati15Pattern di progettazione Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositePattern RepositoryEsercitati da solo: Compilatore Dart online