Menu
Coddy logo textTech

Parola chiave on nei Mixin

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

A volte un mixin deve usare metodi o proprietà della classe in cui viene incluso. La parola chiave on ti permette di limitare l’uso di un mixin alle sole classi che estendono un tipo specifico.

class Animal {
  String name;
  Animal(this.name);
  
  void breathe() => print('$name is breathing');
}

mixin Swimming on Animal {
  void swim() {
    print('$name is swimming');  // Può accedere a 'name' da Animal
    breathe();  // Può chiamare i metodi di Animal
  }
}

class Fish extends Animal with Swimming {
  Fish(String name) : super(name);
}

La dichiarazione on Animal significa che questo mixin può essere applicato solo alle classi che estendono Animal. Questo garantisce che il mixin abbia accesso ai membri di Animal. Senza on, il mixin non saprebbe che name o breathe() esistono.

Se provi a usare un mixin con restrizioni su una classe incompatibile, Dart genera un errore in fase di compilazione:

class Robot with Swimming {}  // Errore! Robot non estende Animal

Questo vincolo è utile quando le funzionalità del tuo mixin dipendono da capacità specifiche di una classe base. Crea un contratto più sicuro: il mixin garantisce determinati comportamenti, ma solo quando dispone delle basi necessarie per funzionare correttamente.

challenge icon

Sfida

Facile

Creiamo un sistema di veicoli che dimostri come la parola chiave on limiti l’uso dei mixin a classi base specifiche. Creerai un mixin che aggiunge la funzionalità di turbo boost, ma può essere usato solo da classi che estendono una classe base Vehicle.

Organizzerai il codice in due file:

  • vehicles.dart: definisci qui la classe base, il mixin con restrizioni e i tipi di veicoli:
    • Una classe Vehicle con una proprietà String model e una proprietà int speed. Includi un costruttore che accetti entrambi i valori. Aggiungi un metodo accelerate() che stampa [model] accelerating to [speed] km/h
    • Un mixin TurboBoost limitato a Vehicle tramite la parola chiave on. Questo mixin deve avere un metodo activateTurbo() che stampa [model] TURBO ACTIVATED! e poi chiama accelerate() (entrambi sono accessibili grazie al vincolo on Vehicle)
    • Una classe SportsCar che estende Vehicle e usa il mixin TurboBoost. Aggiungi una proprietà String color. Il costruttore deve accettare model, speed e color. Includi un metodo showOff() che stampa [color] [model] ready to race!
  • main.dart: importa il file dei veicoli e dimostra come funziona il mixin con restrizioni:
    • Crea una SportsCar con model 'Ferrari', speed 320 e color 'Red'
    • Chiama showOff()
    • Chiama activateTurbo()

Il mixin TurboBoost può accedere a model e chiamare accelerate() perché la dichiarazione on Vehicle garantisce che venga applicato solo a classi che estendono Vehicle. Questo crea un contratto sicuro in cui il mixin sa esattamente quali funzionalità sono disponibili.

Output previsto:

Red Ferrari ready to race!
Ferrari TURBO ACTIVATED!
Ferrari accelerating to 320 km/h

Provalo tu

import 'vehicles.dart';

void main() {
  // TODO: Crea una SportsCar con modello 'Ferrari', velocità 320 e colore 'Red'
  
  // TODO: Chiama showOff()
  
  // TODO: Chiama activateTurbo()
}
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