Menu
Coddy logo textTech

Introduzione ai Mixin

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

Hai imparato che Dart consente di estendere una sola classe e che, anche se puoi implementare più interfacce, devi scrivere tutto il codice da solo. Ma cosa succede se vuoi condividere codice di implementazione effettivo tra più classi non correlate? È qui che entrano in gioco i mixin.

Un mixin è un modo per riutilizzare il codice in più gerarchie di classi. Pensalo come un insieme di metodi e proprietà che puoi «mescolare» in qualsiasi classe, assegnandole nuove capacità senza usare l’ereditarietà.

mixin Swimming {
  void swim() {
    print('Swimming through the water');
  }
}

class Duck with Swimming {
  void quack() {
    print('Quack!');
  }
}

class Fish with Swimming {
  void blowBubbles() {
    print('Blub blub');
  }
}

void main() {
  var duck = Duck();
  duck.quack();
  duck.swim();  // Del mixin
  
  var fish = Fish();
  fish.swim();  // Misma implementación, clase diferente
}

Nota la parola chiave with: è così che applichi un mixin a una classe. A differenza di implements, non devi scrivere il metodo tu stesso. Il mixin fornisce il codice vero e proprio e la tua classe acquisisce automaticamente questa funzionalità.

I mixin risolvono un problema concreto: Duck e Fish non sono correlati tramite ereditarietà, eppure entrambi hanno bisogno del comportamento di nuoto. Con i mixin, scrivi il codice una sola volta e lo condividi ovunque sia necessario.

challenge icon

Sfida

Facile

Costruiamo un sistema di strumenti musicali che mostri come i mixin permettano di condividere comportamenti tra classi non correlate. Creerai un mixin che fornisce funzionalità di accordatura, poi lo applicherai a diversi strumenti che non sono correlati tramite ereditarietà.

Organizzerai il codice in due file:

  • instruments.dart: definisci qui il tuo mixin e le classi degli strumenti:
    • Un mixin Tunable con un metodo tune() che stampa Tuning the instrument... e un metodo checkTuning() che stampa Tuning is perfect!
    • Una classe Guitar che usa il mixin Tunable. Aggiungi una proprietà String brand con un costruttore. Includi un metodo strum() che stampa [brand] guitar strumming chords
    • Una classe Piano che usa anch'essa il mixin Tunable. Aggiungi una proprietà int keys con un costruttore. Includi un metodo play() che stampa Playing [keys]-key piano
  • main.dart: importa il file degli strumenti e mostra come entrambi gli strumenti non correlati acquisiscano funzionalità di accordatura dallo stesso mixin:
    • Crea una Guitar con il marchio 'Fender'
    • Crea un Piano con 88 tasti
    • Per la chitarra: chiama tune(), poi strum(), poi checkTuning()
    • Stampa una riga vuota
    • Per il pianoforte: chiama tune(), poi play(), poi checkTuning()

Nota come Guitar e Piano siano strumenti completamente diversi e non abbiano alcuna relazione di ereditarietà, eppure entrambi acquisiscano esattamente gli stessi metodi di accordatura dal mixin Tunable. Scrivi il codice per l'accordatura una sola volta ed entrambe le classi possono usarlo con la parola chiave with.

Output previsto:

Tuning the instrument...
Fender guitar strumming chords
Tuning is perfect!

Tuning the instrument...
Playing 88-key piano
Tuning is perfect!

Provalo tu

import 'instruments.dart';

void main() {
  // TODO: Crea una Guitar di marca 'Fender'
  
  // TODO: Crea un Piano con 88 tasti
  
  // TODO: Per la chitarra: chiama tune(), poi strum(), poi checkTuning()
  
  // TODO: Stampa una riga vuota
  
  // TODO: Per il pianoforte: chiama tune(), poi play(), poi checkTuning()
}
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