Menu
Coddy logo textTech

Interfacce in Dart

Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 45 di 110.

A differenza di molti linguaggi che hanno una parola chiave interface dedicata, Dart adotta un approccio diverso. In Dart, ogni classe definisce automaticamente un’interfaccia. Questa interfaccia è composta da tutti i membri pubblici (metodi e proprietà) dichiarati dalla classe.

Quando vuoi che una classe prometta di fornire determinate funzionalità senza ereditare un'implementazione, usi la parola chiave implements:

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

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

// MultiFunctionDevice deve implementare TUTTI i metodi di entrambe le classi
class MultiFunctionDevice implements Printer, Scanner {
  @override
  void printDocument(String content) {
    print('MFD printing: $content');
  }
  
  @override
  void scan() {
    print('MFD scanning');
  }
}

La differenza fondamentale rispetto a extends è che implements non eredita alcun codice. Devi fornire la tua implementazione per ogni metodo e proprietà definiti nell’interfaccia. È un contratto: prometti che la tua classe avrà queste capacità, ma decidi tu esattamente come funzionano.

Questo approccio offre flessibilità a Dart. Puoi usare classi astratte quando vuoi definire interfacce senza implementazione, oppure usare classi normali come interfacce quando ha senso. La prossima lezione esplora più nel dettaglio come funziona questo concetto di «interfaccia implicita».

challenge icon

Sfida

Facile

Costruiamo un sistema di riproduzione multimediale che dimostri come funziona la parola chiave implements in Dart. Creerai classi che fungono da interfacce e poi le implementerai in un unico dispositivo che combina più funzionalità.

Organizzerai il codice in due file:

  • media.dart: definisci qui le classi interfaccia e la classe che le implementa:
    • Una classe AudioPlayer con un metodo playAudio(String track) che stampa Playing audio: [track]
    • Una classe VideoPlayer con un metodo playVideo(String title) che stampa Playing video: [title]
    • Una classe SmartTV che implementa sia AudioPlayer sia VideoPlayer. Poiché implements non eredita alcun codice, devi fornire implementazioni personalizzate per entrambi i metodi. La tua classe SmartTV deve stampare SmartTV audio: [track] per l'audio e SmartTV video: [title] per il video
  • main.dart: importa il file multimediale e mostra come una singola classe possa implementare più interfacce:
    • Crea un'istanza di SmartTV
    • Chiama playAudio('Jazz Collection')
    • Chiama playVideo('Nature Documentary')

Nota come SmartTV debba fornire una propria implementazione per ogni metodo di entrambe le interfacce: non eredita le implementazioni originali da AudioPlayer o VideoPlayer. Questa è la differenza fondamentale tra implements e extends.

Output previsto:

SmartTV audio: Jazz Collection
SmartTV video: Nature Documentary

Provalo tu

import 'media.dart';

void main() {
  // TODO: Crea un'istanza di SmartTV
  
  // TODO: Chiama playAudio('Jazz Collection')
  
  // TODO: Chiama playVideo('Nature Documentary')
  
}
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