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.
Sfida
FacileCostruiamo 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 metodostart()che stampa[brand] engine starting... - Una classe
Motorcycleche estendeVehicle. Dovrebbe avere una proprietà aggiuntivaint cc(cilindrata del motore), un costruttore che accetta sia la marca sia la cilindrata (passando la marca alla classe genitrice usandosuper) e un proprio metodowheelie()che stampa[brand] is doing a wheelie!
- Una classe
main.dart: Importa il file dei veicoli e mostra l’ereditarietà in azione:- Crea un
Vehiclecon marca'Toyota' - Chiama il suo metodo
start() - Crea una
Motorcyclecon marca'Harley'e cilindrata1200 - Chiama il metodo
start()della motocicletta (ereditato da Vehicle) - Chiama il metodo
wheelie()della motocicletta (definito in Motorcycle) - Stampa
Motorcycle engine: [cc]ccper mostrare la proprietà propria della classe figlia
- Crea un
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: 1200ccProvalo 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
}
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