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.
Sfida
FacileCostruiamo 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 Vehiclecon le proprietàString brandeint year. Includi un costruttore che accetta entrambi i valori e un metododisplayInfo()che stampa[brand] ([year]) - Una classe
Carche estendeVehiclee aggiunge la proprietàint doors. Includi un metodohonk()che stampaBeep beep! - Una classe
Motorcycleche estendeVehiclee aggiunge la proprietàbool hasSidecar. Includi un metodorevEngine()che stampaVroom!
- Una
main.dart: importa il file dei veicoli e mostra come funzionano le classi astratte:- Crea una
Carcon marca'Toyota', anno2022e numero di porte4 - Chiama il suo metodo
displayInfo()(ereditato da Vehicle) - Stampa
Doors: [doors] - Chiama il suo metodo
honk() - Stampa una riga vuota
- Crea una
Motorcyclecon marca'Harley', anno2021efalseper hasSidecar - Chiama il suo metodo
displayInfo() - Stampa
Has sidecar: [hasSidecar] - Chiama il suo metodo
revEngine()
- Crea una
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
}
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
1Fondamenti della programmazione orientata agli oggetti
File esterniLibrerie e importazioniIntroduzione alla programmazione orientata agli oggettiClassi e oggettiLa parola chiave thisMetodiVariabili di istanzaFondamenti dei costruttoriRiepilogo - Calcolatrice semplice4Sicurezza dei valori null
Introduzione alla sicurezza dei valori nullNullable e non nullableGli operatori ? e !La keyword late e la sicurezza dei valori nullOperatori null-awareSicurezza dei valori null nelle classiRiepilogo - Sistema di profili utente7Classi astratte e interfacce
Classi astratteMetodi astrattiInterfacce in DartInterfacce impliciteImplementare vs estendereInterfacce multipleRiepilogo - Calcolatore di forme10Collezioni e generici
Panoramica di List, Set e MapCollezioni sicure rispetto ai tipiClassi genericheMetodi genericiVincoli sui genericiIterable e IteratorRiepilogo - Archiviazione generica13Concetti avanzati di OOP
Composizione vs ereditarietàMetodi di estensioneClassi chiamabiliClassi sealed (Dart 3)Record (Dart 3)Pattern e matching (3.0)Enum con metodi16Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente2I costruttori in Dart
Costruttore predefinitoCostruttori con nomeListe di inizializzazioneCostruttori costantiCostruttori factoryCostruttori di reindirizzamentoRiepilogo - Crea forme5Incapsulamento
Membri pubblici e privatiConvenzione del prefisso _Visibilità a livello di libreriaApprofondimento su getter e setterNascondimento delle informazioniRiepilogo - Registri degli studenti8Mixin
Introduzione ai MixinCreare MixinUsare più MixinParola chiave on nei MixinMixin vs ereditarietàMixin vs interfacciaRiepilogo - Sistema animale11Metodi speciali
Sovrascrittura di toString()Sovrascrittura di hashCode e ==Interfaccia ComparableMetodo call()Sovrascrittura di noSuchMethodRiepilogo - Collezione personalizzata14Modelli di progettazione Parte 1
Introduzione ai modelli di progettazioneSingletonFactoryObserverStrategy3Proprietà delle classi
Membri di istanza e staticiCampi final e constVariabili lateMetodi e campi staticiGetter e setterRiepilogo - Gestore di conti bancari6Ereditarietà
Ereditarietà di baseLa parola chiave superOverride dei metodiL’annotazione @overrideLa parola chiave final per le classiCostruttori ed ereditarietàRiepilogo - Gerarchia dei dipendenti9Polimorfismo
Fondamenti di polimorfismoPolimorfismo tramite interfacceControllo del tipo a runtimeGli operatori is e asParola chiave covariantRiepilogo - Elaboratore di pagamenti12OOP asincrona
Future e async/awaitNozioni di base sugli streamController degli streamCostruttori asincroniAsync nei metodi di classeRiepilogo - Recupero dei dati15Pattern di progettazione Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositePattern RepositoryEsercitati da solo: Compilatore Dart online