Menu
Coddy logo textTech

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.

challenge icon

Sfida

Facile

Costruiamo 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 Connectable con un metodo connect() che stampa Connecting to network...
    • Una classe Chargeable con un metodo charge() che stampa Charging battery...
    • Una classe Displayable con un metodo showScreen(String content) che stampa Displaying: [content]
    • Una classe Tablet che implementa tutte e tre le interfacce: Connectable, Chargeable e Displayable. Aggiungi una proprietà String brand con un costruttore. Le tue implementazioni dovrebbero stampare [brand] tablet connecting to WiFi per connect, [brand] tablet charging via USB-C per charge e [brand] screen: [content] per showScreen
  • main.dart: importa il file dei dispositivi e mostra come Tablet soddisfa tutti e tre i contratti delle interfacce:
    • Crea un Tablet con il brand 'Galaxy'
    • Chiama connect()
    • Chiama charge()
    • Chiama showScreen('Welcome Home')

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 Home

Provalo tu

import 'devices.dart';

void main() {
  // TODO: Crea un Tablet di marca 'Galaxy'
  
  // TODO: Chiama connect()
  
  // TODO: Chiama charge()
  
  // TODO: Chiama showScreen('Welcome Home')
  
}
quiz iconMettiti alla prova

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

Esercitati da solo: Compilatore Dart online