Menu
Coddy logo textTech

Costruttori ed ereditarietà

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

Quando una classe figlia estende una classe genitore, è necessario chiamare il costruttore della classe genitore per inizializzare correttamente i campi ereditati. Dart offre modi flessibili per gestire questa operazione tramite la lista di inizializzazione usando super.

Se la classe genitore ha un costruttore parametrizzato, la classe figlia deve richiamarlo esplicitamente:

class Person {
  String name;
  int age;
  
  Person(this.name, this.age);
}

class Student extends Person {
  String school;
  
  Student(String name, int age, this.school) : super(name, age);
}

Dart 2.17 ha introdotto i parametri super, una sintassi più pulita che inoltra i parametri direttamente al costruttore della classe genitore:

class Student extends Person {
  String school;
  
  // super.name e super.age vengono passati direttamente al costruttore di Person
  Student(super.name, super.age, this.school);
}

Quando lavori con i costruttori con nome, specifichi quale costruttore della classe genitore chiamare:

class Employee extends Person {
  String department;
  
  Employee(super.name, super.age, this.department);
  
  Employee.intern(String name, this.department) : super(name, 18);
}

La regola fondamentale è semplice: la classe genitore deve essere completamente inizializzata prima che la classe figlia aggiunga le proprie proprietà. Che tu usi la tradizionale chiamata super() o i super parametri più recenti, Dart garantisce che la catena di ereditarietà venga costruita correttamente dal genitore alla classe figlia.

challenge icon

Sfida

Facile

Costruiamo un sistema di inventario dei prodotti che mostri come funzionano i costruttori con l’ereditarietà. Creerai una gerarchia in cui diversi tipi di prodotto estendono una classe di prodotto base, ciascuno richiedendo una corretta inizializzazione tramite i costruttori della classe genitore.

Organizzerai il codice in due file:

  • product.dart: definisci qui la gerarchia dei prodotti:
    • Una classe Product con le proprietà String name e double price, un costruttore che accetta entrambi i valori e un metodo info() che stampa [name]: $[price]
    • Una classe Book che estende Product e aggiunge una proprietà String author. Usa i parametri super per inoltrare name e price al costruttore della classe genitore
    • Una classe Electronics che estende Product e aggiunge una proprietà int warranty (in mesi). Usa la chiamata tradizionale a super() nell’elenco di inizializzazione per passare i valori alla classe genitore
  • main.dart: importa il file dei prodotti e mostra entrambi gli approcci all’ereditarietà dei costruttori:
    • Crea un Book con nome 'Dart Essentials', prezzo 29.99 e autore 'Jane Smith'
    • Chiama il suo metodo info(), poi stampa Author: [author]
    • Stampa una riga vuota
    • Crea un Electronics con nome 'Wireless Mouse', prezzo 45.50 e garanzia 24
    • Chiama il suo metodo info(), poi stampa Warranty: [warranty] months

Entrambe le classi figlie ereditano il metodo info() da Product senza doverlo sovrascrivere. La differenza principale sta nel modo in cui chiamano il costruttore della classe genitore: Book usa la sintassi più semplice dei parametri super, mentre Electronics usa l’approccio tradizionale con super() nell’elenco di inizializzazione.

Output previsto:

Dart Essentials: $29.99
Author: Jane Smith

Wireless Mouse: $45.5
Warranty: 24 months

Provalo tu

import 'product.dart';

void main() {
  // TODO: Crea un Book con:
  // - name: 'Dart Essentials'
  // - price: 29.99
  // - author: 'Jane Smith'

  // TODO: Chiama il metodo info() del libro

  // TODO: Stampa "Author: [author]"

  // TODO: Stampa una riga vuota

  // TODO: Crea un Electronics con:
  // - name: 'Wireless Mouse'
  // - price: 45.50
  // - warranty: 24

  // TODO: Chiama il metodo info() dell'oggetto Electronics

  // TODO: Stampa "Warranty: [warranty] months"
}
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