Menu
Coddy logo textTech

Mixin vs ereditarietà

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

Ora che hai imparato come funzionano i mixin, chiariamo quando usarli invece dell'ereditarietà. La differenza principale sta nella relazione che esprimono.

L'ereditarietà rappresenta una relazione "è-un". Un Dog è un Animal. La sottoclasse è una versione specializzata della classe genitore e puoi estendere una sola classe.

I mixin, d'altra parte, rappresentano una relazione di tipo "può fare". Un Dog può nuotare, ma nuotare non è ciò che definisce un cane.

// Ereditarietà: Dog È un Animal
class Animal {
  String name;
  Animal(this.name);
}

class Dog extends Animal {
  Dog(String name) : super(name);
}

// Mixin: Dog PUÒ nuotare (ma non è definito dal fatto di nuotare)
mixin Swimming {
  void swim() => print('Swimming');
}

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

Usa l'ereditarietà quando le classi condividono un'identità fondamentale e hai bisogno di costruttori nella classe genitore. Usa i mixin quando vuoi aggiungere funzionalità a classi che non condividono un antenato comune.

CaratteristicaEreditarietàMixin
Relazioneè-unpuò-fare
LimiteUn solo genitorePiù mixin
CostruttoriConsentitiNon consentiti
Caso d'usoSpecializzazioneComportamento condiviso

La parte migliore? Puoi combinarli entrambi: estendere una classe e integrare più funzionalità, dando alle tue classi esattamente le caratteristiche di cui hanno bisogno.

challenge icon

Sfida

Facile

Costruiamo un sistema di lavoratori che mostri quando usare l'ereditarietà invece dei mixin. Creerai una classe base per la relazione «è-un» e dei mixin per le capacità «può-fare», poi li combinerai per mostrare come funzionano insieme entrambi gli approcci.

Organizzerai il codice in tre file:

  • worker.dart: Definisci la classe base che stabilisce l'identità fondamentale di tutti i lavoratori:
    • Una classe Worker con le proprietà String name e String department. Includi un costruttore che accetta entrambi i valori. Aggiungi un metodo introduce() che stampa [name] works in [department]
  • skills.dart: Definisci i mixin che rappresentano le capacità che i lavoratori possono avere (le relazioni «può-fare»):
    • Un mixin CanCode con un metodo writeCode() che stampa Writing code...
    • Un mixin CanDesign con un metodo createDesign() che stampa Creating design...
    • Un mixin CanManage con un metodo leadTeam() che stampa Leading the team...
  • main.dart: Importa entrambi i file e crea tipi specializzati di lavoratori che combinano l'ereditarietà con i mixin:
    • Una classe Developer che estende Worker e usa il mixin CanCode
    • Una classe TechLead che estende Worker e usa entrambi i mixin CanCode e CanManage
    • Crea un Developer di nome 'Alice' nel reparto 'Engineering'
    • Crea un TechLead di nome 'Bob' nel reparto 'Engineering'
    • Per Alice: chiama introduce() e poi writeCode()
    • Stampa una riga vuota
    • Per Bob: chiama introduce(), poi writeCode() e infine leadTeam()

Nota come sia Developer sia TechLead siano lavoratori (ereditarietà), ma possano fare cose diverse (mixin). TechLead combina più capacità senza bisogno dell'ereditarietà multipla.

Output previsto:

Alice works in Engineering
Writing code...

Bob works in Engineering
Writing code...
Leading the team...

Provalo tu

import 'worker.dart';
import 'skills.dart';

// TODO: Crea una classe Developer che estenda Worker e usi il mixin CanCode

// TODO: Crea una classe TechLead che estenda Worker e usi entrambi i mixin CanCode e CanManage

void main() {
  // TODO: Crea un Developer di nome 'Alice' nel dipartimento 'Engineering'
  
  // TODO: Chiama introduce() e poi writeCode() per Alice
  
  // TODO: Stampa una riga vuota
  
  // TODO: Crea un TechLead di nome 'Bob' nel dipartimento 'Engineering'
  
  // TODO: Chiama introduce(), poi writeCode() e infine leadTeam() per Bob
}
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