Menu
Coddy logo textTech

Creare Mixin

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

Ora che hai capito cosa sono i mixin, vediamo come crearli correttamente. Un mixin viene dichiarato usando la parola chiave mixin invece di class.

mixin Logging {
  void log(String message) {
    print('[LOG] $message');
  }
  
  void logError(String error) {
    print('[ERROR] $error');
  }
}

I mixin possono contenere metodi, proprietà e persino getter e setter, proprio come le classi. Tuttavia, c'è una regola importante: i mixin non possono avere costruttori. Poiché i mixin sono pensati per essere «mescolati» alle classi anziché istanziati direttamente, non hanno bisogno di logica di inizializzazione.

mixin Timestamped {
  DateTime createdAt = DateTime.now();
  
  String get formattedTime => createdAt.toString();
  
  void printTimestamp() {
    print('Created at: $formattedTime');
  }
}

class Document with Timestamped {
  String title;
  Document(this.title);
}

void main() {
  var doc = Document('Report');
  doc.printTimestamp();  // Usa il metodo del mixin
  print(doc.createdAt);  // Usa la proprietà del mixin
}

Quando applichi un mixin con with, tutti i suoi membri diventano parte della tua classe. La classe può usarli direttamente, così come qualsiasi codice che abbia un'istanza di quella classe. Questo rende i mixin un modo semplice per aggiungere funzionalità riutilizzabili senza la complessità delle gerarchie di ereditarietà.

challenge icon

Sfida

Facile

Costruiamo un sistema di messaggistica che mostri come creare mixin con metodi, proprietà e getter. Progetterai un mixin che aggiunge funzionalità di formattazione a diversi tipi di messaggi.

Organizzerai il codice in due file:

  • messaging.dart: definisci qui il tuo mixin e le classi dei messaggi:
    • Un mixin Formattable che contiene:
      • Una proprietà String prefix inizializzata a '>>>'
      • Un getter separator che restituisce ' | '
      • Un metodo format(String text) che restituisce la stringa [prefix][separator][text]
      • Un metodo formatBold(String text) che restituisce **[text]**
    • Una classe TextMessage che usa il mixin Formattable. Aggiungi una proprietà String sender con un costruttore. Includi un metodo send(String content) che stampa il risultato della chiamata a format() con [sender]: [content]
    • Una classe AlertMessage che usa anch'essa il mixin Formattable. Aggiungi una proprietà String level con un costruttore. Includi un metodo alert(String content) che stampa il risultato della chiamata a format() con [[level]] [formatBold(content)]
  • main.dart: importa il tuo file di messaggistica e mostra come entrambi i tipi di messaggio acquisiscono le funzionalità di formattazione dal mixin:
    • Crea un TextMessage con mittente 'Alice'
    • Crea un AlertMessage con livello 'WARNING'
    • Chiama send('Hello there!') sul messaggio di testo
    • Chiama alert('System overload') sul messaggio di avviso

Il tuo mixin dimostra che i mixin possono contenere proprietà con valori predefiniti, getter che calcolano valori e più metodi che possono anche richiamarsi a vicenda. Entrambe le classi di messaggi ottengono tutte queste funzionalità semplicemente usando la parola chiave with.

Output previsto:

>>> | Alice: Hello there!
>>> | [WARNING] **System overload**

Provalo tu

import 'messaging.dart';

void main() {
  // TODO: Crea un TextMessage con sender 'Alice'
  
  // TODO: Crea un AlertMessage con level 'WARNING'
  
  // TODO: Chiama send('Hello there!') sul messaggio di testo
  
  // TODO: Chiama alert('System overload') sul messaggio di avviso
}
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