Menu
Coddy logo textTech

Ereditarietà di base

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

L'ereditarietà consente a una classe di acquisire le proprietà e i metodi di un'altra classe. Invece di riscrivere lo stesso codice, crei una nuova classe che si basa su una classe esistente. La classe originale è chiamata classe genitore (o superclasse) e la nuova classe è la classe figlia (o sottoclasse).

In Dart, usi la parola chiave extends per ereditare da una classe genitore:

class Animal {
  String name;
  
  Animal(this.name);
  
  void eat() {
    print('$name is eating');
  }
}

class Dog extends Animal {
  Dog(String name) : super(name);
  
  void bark() {
    print('$name says woof!');
  }
}

void main() {
  var dog = Dog('Buddy');
  dog.eat();   // Ereditato da Animal
  dog.bark();  // Definito in Dog
}

La classe Dog ha automaticamente accesso alla proprietà name e al metodo eat() di Animal, oltre al proprio metodo bark(). Questo crea una relazione «è un» - un Dog è un Animal.

La classe figlia può aggiungere nuove proprietà e metodi, ma eredita tutto ciò che è pubblico dalla classe genitrice. Nota che i membri privati (quelli con _) non sono accessibili direttamente nelle sottoclassi di librerie diverse, anche se esistono comunque nell'oggetto ereditato.

challenge icon

Sfida

Facile

Costruiamo un sistema di veicoli che mostri come l’ereditarietà consenta alle classi figlie di riutilizzare ed estendere le funzionalità delle classi genitrici. Creerai una classe genitrice per i veicoli in generale e una classe figlia per un tipo specifico di veicolo.

Organizzerai il codice in due file:

  • vehicle.dart: Definisci qui le tue classi:
    • Una classe Vehicle (la genitrice) con una proprietà String brand, un costruttore che accetta la marca e un metodo start() che stampa [brand] engine starting...
    • Una classe Motorcycle che estende Vehicle. Dovrebbe avere una proprietà aggiuntiva int cc (cilindrata del motore), un costruttore che accetta sia la marca sia la cilindrata (passando la marca alla classe genitrice usando super) e un proprio metodo wheelie() che stampa [brand] is doing a wheelie!
  • main.dart: Importa il file dei veicoli e mostra l’ereditarietà in azione:
    • Crea un Vehicle con marca 'Toyota'
    • Chiama il suo metodo start()
    • Crea una Motorcycle con marca 'Harley' e cilindrata 1200
    • Chiama il metodo start() della motocicletta (ereditato da Vehicle)
    • Chiama il metodo wheelie() della motocicletta (definito in Motorcycle)
    • Stampa Motorcycle engine: [cc]cc per mostrare la proprietà propria della classe figlia

Nota come la classe Motorcycle ottenga automaticamente accesso alla proprietà brand e al metodo start() di Vehicle, pur avendo anche la propria proprietà cc e il proprio metodo wheelie(). Questa è la potenza dell’ereditarietà: costruire a partire da codice esistente.

Output previsto:

Toyota engine starting...
Harley engine starting...
Harley is doing a wheelie!
Motorcycle engine: 1200cc

Provalo tu

import 'vehicle.dart';

void main() {
  // TODO: Crea un Vehicle con marca 'Toyota'
  
  // TODO: Chiama il metodo start() del veicolo
  
  // TODO: Crea un Motorcycle con marca 'Harley' e cc 1200
  
  // TODO: Chiama il metodo start() della motocicletta (ereditato da Vehicle)
  
  // TODO: Chiama il metodo wheelie() della motocicletta
  
  // TODO: Stampa 'Motorcycle engine: [cc]cc' usando la proprietà cc della motocicletta
}
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