Override dei metodi
Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 38 di 110.
L'override dei metodi si verifica quando una classe figlia fornisce una propria implementazione di un metodo già presente nella classe genitore. Ciò consente alle sottoclassi di personalizzare il comportamento ereditato mantenendo la stessa firma del metodo.
Quando definisci un metodo in una classe figlia con lo stesso nome e gli stessi parametri di uno nella classe genitore, la versione della classe figlia prende il suo posto:
class Animal {
String name;
Animal(this.name);
void speak() {
print('$name makes a sound');
}
}
class Dog extends Animal {
Dog(String name) : super(name);
void speak() {
print('$name barks: Woof!');
}
}
void main() {
var animal = Animal('Generic');
var dog = Dog('Buddy');
animal.speak(); // Generic emette un suono
dog.speak(); // Buddy abbaia: Woof!
}Quando chiami speak() su un’istanza di Dog, Dart esegue la versione di Dog, non quella di Animal. La classe figlia ha sovrascritto il metodo della classe genitore.
Puoi anche combinare l'override con super per estendere il comportamento della classe genitore anziché sostituirlo:
class Cat extends Animal {
Cat(String name) : super(name);
void speak() {
super.speak(); // Chiama prima la versione della classe genitore
print('$name also purrs');
}
}Questo modello ti permette di basarti sulle funzionalità esistenti. La regola chiave è semplice: lo stesso nome del metodo e gli stessi parametri nella classe figlia sostituiscono l'implementazione della classe genitore quando viene chiamato su istanze della classe figlia.
Sfida
FacileCreiamo un sistema di notifiche che dimostri come le classi figlie possano sovrascrivere i metodi della classe genitore per personalizzare il comportamento. Creerai diversi tipi di notifica, ognuno dei quali recapiterà i messaggi in modo unico.
Organizzerai il codice in due file:
notification.dart: definisci qui la gerarchia delle notifiche:- Una classe
Notification(la classe genitore) conString titleeString message. Includi un costruttore che accetta entrambi i valori e un metodosend()che stampaNotification: [title] - [message] - Una classe
EmailNotificationche estendeNotificatione aggiunge la proprietàString recipient. Sovrascrivi il metodosend()in modo che stampiSending email to [recipient]: [title] - [message] - Una classe
PushNotificationche estendeNotificatione aggiunge la proprietàString deviceId. Sovrascrivi il metodosend()in modo che chiami prima il metodosend()della classe genitore usandosuper, quindi stampiPushed to device: [deviceId]sulla riga successiva
- Una classe
main.dart: importa il file delle notifiche e mostra il sovrascrivere i metodi in azione:- Crea una
Notificationdi base con titolo'Alert'e messaggio'System update available' - Chiama il suo metodo
send() - Stampa una riga vuota
- Crea una
EmailNotificationcon titolo'Welcome', messaggio'Thanks for signing up!'e destinatario'user@example.com' - Chiama il suo metodo
send() - Stampa una riga vuota
- Crea una
PushNotificationcon titolo'Reminder', messaggio'Meeting in 10 minutes'e deviceId'DEVICE-001' - Chiama il suo metodo
send()
- Crea una
Nota come EmailNotification sostituisca completamente il comportamento della classe genitore, mentre PushNotification lo estenda chiamando prima super.send(). Entrambi gli approcci sono modi validi per sovrascrivere i metodi, a seconda delle tue esigenze.
Output previsto:
Notification: Alert - System update available
Sending email to user@example.com: Welcome - Thanks for signing up!
Notification: Reminder - Meeting in 10 minutes
Pushed to device: DEVICE-001Provalo tu
import 'notification.dart';
void main() {
// TODO: Crea una Notification di base con title 'Alert' e message 'System update available'
// Chiama il suo metodo send()
// TODO: Stampa una riga vuota
// TODO: Crea una EmailNotification con:
// - title: 'Welcome'
// - message: 'Thanks for signing up!'
// - recipient: 'user@example.com'
// Chiama il suo metodo send()
// TODO: Stampa una riga vuota
// TODO: Crea una PushNotification con:
// - title: 'Reminder'
// - message: 'Meeting in 10 minutes'
// - deviceId: 'DEVICE-001'
// Chiama il suo metodo send()
}
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