Menu
Coddy logo textTech

Interfacce implicite

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

Poiché ogni classe Dart definisce automaticamente un'interfaccia, puoi usare qualsiasi classe come interfaccia, anche le classi concrete con implementazioni complete. Questo è ciò che chiamiamo interfaccia implicita.

Considera una classe con proprietà e metodi:

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

Quando un'altra classe implementa Logger, deve fornire la propria implementazione per tutto, inclusa la proprietà 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...');
  }
}

Questa è l’intuizione fondamentale: quando usi implements, stai dicendo «la mia classe avrà la stessa struttura», ovvero gli stessi metodi e proprietà. Non erediti alcun codice, costruttore o valore predefinito. Ti impegni soltanto a rispettare la struttura dell’interfaccia.

Questo rende le interfacce implicite potenti per creare componenti intercambiabili. Il codice che si aspetta un Logger può funzionare con qualsiasi classe che implementi la sua interfaccia, indipendentemente da come funziona internamente quell’implementazione.

challenge icon

Sfida

Facile

Costruiamo un sistema di notifiche che dimostri come le classi concrete possano fungere da interfacce implicite. Creerai una classe di base per le notifiche e poi la implementerai in modo completamente diverso, mostrando che implements richiede di fornire personalmente tutti i membri.

Organizzerai il codice in due file:

  • notification.dart: definisci qui le tue classi di notifica:
    • Una classe Notification con una proprietà String channel impostata su 'default', un metodo send(String message) che stampa [channel]: [message] e un metodo getStatus() che restituisce la stringa 'Notification ready'
    • Una classe EmailNotification che implementa Notification. Poiché usi implements, devi fornire una tua proprietà channel (impostala su 'email'), un tuo metodo send() che stampa Sending email: [message] e un tuo metodo getStatus() che restituisce 'Email service active'
    • Una classe PushNotification che implementa Notification. Imposta il suo channel su 'push', fai in modo che send() stampi Push alert: [message] e fai restituire a getStatus() 'Push service connected'
  • main.dart: importa il file delle notifiche e mostra come classi diverse possano implementare la stessa interfaccia implicita con comportamenti completamente diversi:
    • Crea un'istanza di EmailNotification e una di PushNotification
    • Per ogni notifica, stampa il suo stato usando getStatus(), poi chiama send() con il messaggio 'Hello World'
    • Stampa una riga vuota tra le due notifiche

Ricorda: quando usi implements, non erediti alcun codice da Notification. Prometti solo che la tua classe avrà la stessa struttura: le stesse proprietà e gli stessi metodi. Ogni classe che implementa l'interfaccia fornisce la propria implementazione completa.

Output previsto:

Email service active
Sending email: Hello World

Push service connected
Push alert: Hello World

Provalo tu

import 'notification.dart';

void main() {
  // TODO: Crea un'istanza di EmailNotification
  
  // TODO: Stampa lo stato della notifica email usando getStatus()
  
  // TODO: Invia un messaggio 'Hello World' usando la notifica email
  
  // TODO: Stampa una riga vuota
  
  // TODO: Crea un'istanza di PushNotification
  
  // TODO: Stampa lo stato della notifica push usando getStatus()
  
  // TODO: Invia un messaggio 'Hello World' usando la notifica push
  
}
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