La parola chiave super
Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 37 di 110.
La parola chiave super dà a una classe figlia accesso diretto alla sua classe genitore. L'hai già vista nei costruttori con super(name), ma è utile anche in altri contesti.
Quando devi chiamare il costruttore della classe genitore, super passa gli argomenti lungo la catena di ereditarietà:
class Vehicle {
String brand;
int year;
Vehicle(this.brand, this.year);
}
class Car extends Vehicle {
int doors;
Car(String brand, int year, this.doors) : super(brand, year);
}La parola chiave super ti permette anche di accedere ai metodi e alle proprietà della classe genitore dall'interno della classe figlia. È particolarmente utile quando vuoi usare il comportamento della classe genitore insieme al tuo:
class Animal {
String name;
Animal(this.name);
void makeSound() {
print('$name makes a sound');
}
}
class Cat extends Animal {
Cat(String name) : super(name);
void makeSound() {
super.makeSound(); // Chiama prima il metodo della classe genitore
print('$name says meow!');
}
}Quando chiami super.makeSound(), invochi esplicitamente la versione del metodo della classe padre. Senza super, chiamare makeSound() farebbe riferimento al metodo della classe corrente, causando potenzialmente una ricorsione infinita.
Pensa a super come a dire «usa la versione del mio genitore», che si tratti di un costruttore, un metodo o una proprietà.
Sfida
FacileCostruiamo un sistema di messaggistica che dimostri come la parola chiave super consenta alle classi figlie di accedere al comportamento della classe genitore ed estenderlo. Creerai una gerarchia in cui diversi tipi di messaggio si basano su una classe di messaggio di base.
Organizzerai il codice in due file:
message.dart: definisci qui le tue classi di messaggio:- Una classe
Message(la classe genitore) con unString sendere unString content. Includi un costruttore che accetti entrambi i valori e un metododisplay()che stampiFrom [sender]: [content] - Una classe
UrgentMessageche estendeMessage. Dovrebbe avere una proprietà aggiuntivaString priority. Il costruttore accetta sender, content e priority, passando i primi due alla classe genitore usandosuper. Sovrascrivi il metododisplay()per chiamare prima la versione della classe genitore usandosuper.display(), quindi stamparePriority: [priority]sulla riga successiva
- Una classe
main.dart: importa il file dei messaggi e mostra come funzionasupersia nei costruttori sia nei metodi:- Crea un
Messagenormale da'Alice'con il contenuto'Hello there!' - Chiama il suo metodo
display() - Stampa una riga vuota come separatore
- Crea un
UrgentMessageda'Bob'con il contenuto'Server is down!'e priorità'HIGH' - Chiama il suo metodo
display()
- Crea un
Nota come UrgentMessage usi super in due modi: nel costruttore per passare i dati alla classe genitore e nel metodo sovrascritto per includere l'output della classe genitore prima di aggiungere il proprio.
Output previsto:
From Alice: Hello there!
From Bob: Server is down!
Priority: HIGHProvalo tu
import 'message.dart';
void main() {
// TODO: Crea un Message normale da 'Alice' con contenuto 'Hello there!'
// TODO: Chiama il metodo display() sul messaggio
// TODO: Stampa una riga vuota come separatore
// TODO: Crea un UrgentMessage da 'Bob' con contenuto 'Server is down!' e priorità 'HIGH'
// TODO: Chiama il metodo display() sul messaggio urgente
}
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