Menu
Coddy logo textTech

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.

challenge icon

Sfida

Facile

Creiamo 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) con String title e String message. Includi un costruttore che accetta entrambi i valori e un metodo send() che stampa Notification: [title] - [message]
    • Una classe EmailNotification che estende Notification e aggiunge la proprietà String recipient. Sovrascrivi il metodo send() in modo che stampi Sending email to [recipient]: [title] - [message]
    • Una classe PushNotification che estende Notification e aggiunge la proprietà String deviceId. Sovrascrivi il metodo send() in modo che chiami prima il metodo send() della classe genitore usando super, quindi stampi Pushed to device: [deviceId] sulla riga successiva
  • main.dart: importa il file delle notifiche e mostra il sovrascrivere i metodi in azione:
    • Crea una Notification di base con titolo 'Alert' e messaggio 'System update available'
    • Chiama il suo metodo send()
    • Stampa una riga vuota
    • Crea una EmailNotification con titolo 'Welcome', messaggio 'Thanks for signing up!' e destinatario 'user@example.com'
    • Chiama il suo metodo send()
    • Stampa una riga vuota
    • Crea una PushNotification con titolo 'Reminder', messaggio 'Meeting in 10 minutes' e deviceId 'DEVICE-001'
    • Chiama il suo metodo send()

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-001

Provalo 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()
}
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