Menu
Coddy logo textTech

Classi astratte

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

Una classe astratta è una classe che non può essere istanziata direttamente. Funge da modello per altre classi, definendo una struttura comune che le sottoclassi devono seguire. Ne crei una usando la parola chiave abstract.

abstract class Shape {
  String color;
  
  Shape(this.color);
  
  void describe() {
    print('A $color shape');
  }
}

class Circle extends Shape {
  double radius;
  
  Circle(String color, this.radius) : super(color);
}

void main() {
  // Shape s = Shape('red');  // Errore! Impossibile istanziare una classe astratta
  var circle = Circle('blue', 5.0);
  circle.describe();  // Una forma blu
}

Le classi astratte sono utili quando hai un concetto troppo generale per esistere da solo. Una «Forma» è un’idea, ma non puoi disegnare una forma senza sapere se è un cerchio, un rettangolo o un triangolo. La classe astratta definisce ciò che tutte le forme hanno in comune, mentre le sottoclassi concrete forniscono i dettagli specifici.

Nota che le classi astratte possono comunque avere metodi normali con implementazioni (come describe()) e costruttori. Le sottoclassi ereditano questi elementi proprio come avviene con la normale ereditarietà. La differenza fondamentale è semplicemente che non puoi creare un'istanza della classe astratta stessa: devi usare una sottoclasse concreta.

challenge icon

Sfida

Facile

Costruiamo un sistema di veicoli che mostri come le classi astratte fungano da modelli per tipi più specifici. Creerai una classe base astratta che definisce ciò che tutti i veicoli hanno in comune, poi la estenderai con tipi concreti di veicoli.

Organizzerai il codice in due file:

  • vehicle.dart: definisci qui la gerarchia dei veicoli:
    • Una abstract class Vehicle con le proprietà String brand e int year. Includi un costruttore che accetta entrambi i valori e un metodo displayInfo() che stampa [brand] ([year])
    • Una classe Car che estende Vehicle e aggiunge la proprietà int doors. Includi un metodo honk() che stampa Beep beep!
    • Una classe Motorcycle che estende Vehicle e aggiunge la proprietà bool hasSidecar. Includi un metodo revEngine() che stampa Vroom!
  • main.dart: importa il file dei veicoli e mostra come funzionano le classi astratte:
    • Crea una Car con marca 'Toyota', anno 2022 e numero di porte 4
    • Chiama il suo metodo displayInfo() (ereditato da Vehicle)
    • Stampa Doors: [doors]
    • Chiama il suo metodo honk()
    • Stampa una riga vuota
    • Crea una Motorcycle con marca 'Harley', anno 2021 e false per hasSidecar
    • Chiama il suo metodo displayInfo()
    • Stampa Has sidecar: [hasSidecar]
    • Chiama il suo metodo revEngine()

Ricorda che non puoi creare direttamente un'istanza di Vehicle, poiché è astratta: devi usare una delle sottoclassi concrete. Sia Car sia Motorcycle ereditano il metodo displayInfo() dalla classe genitore astratta.

Output previsto:

Toyota (2022)
Doors: 4
Beep beep!

Harley (2021)
Has sidecar: false
Vroom!

Provalo tu

import 'vehicle.dart';

void main() {
  // TODO: Crea un Car con brand 'Toyota', year 2022 y doors 4
  
  // TODO: Llama a displayInfo() en el coche
  
  // TODO: Imprime "Doors: [doors]"
  
  // TODO: Llama a honk() en el coche
  
  // TODO: Imprime una línea en blanco
  
  // TODO: Crea una Motorcycle con brand 'Harley', year 2021 y hasSidecar false
  
  // TODO: Llama a displayInfo() en la motocicleta
  
  // TODO: Imprime "Has sidecar: [hasSidecar]"
  
  // TODO: Llama a revEngine() en la motocicleta
}
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