Menu
Coddy logo textTech

L’annotazione @override

Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 39 di 110.

L'annotazione @override è un contrassegno di buona pratica che comunica a Dart (e agli altri sviluppatori) che stai intenzionalmente sovrascrivendo un metodo di una classe genitore. Sebbene la sovrascrittura dei metodi funzioni anche senza, usare @override aggiunge un'importante rete di sicurezza.

class Animal {
  String name;
  
  Animal(this.name);
  
  void speak() {
    print('$name makes a sound');
  }
}

class Dog extends Animal {
  Dog(String name) : super(name);
  
  @override
  void speak() {
    print('$name barks: Woof!');
  }
}

L'annotazione offre due vantaggi fondamentali. Innanzitutto, documenta chiaramente la tua intenzione: chiunque legga il codice capisce subito che questo metodo esiste nella classe genitore. In secondo luogo, l'analizzatore di Dart ti avviserà se il metodo genitore non esiste davvero, aiutandoti a individuare tempestivamente refusi ed errori di refactoring.

Considera cosa succede se scrivi in modo errato il nome del metodo senza @override:

class Cat extends Animal {
  Cat(String name) : super(name);
  
  void speek() {  // Refuso! Nessun avviso senza @override
    print('$name meows');
  }
}

Senza l'annotazione, Dart presume che tu stia creando un nuovo metodo chiamato speek(). Con @override, l'analizzatore segnalerebbe immediatamente che nella classe genitore non esiste alcun metodo del genere. Questa semplice annotazione previene bug sottili che potrebbero essere difficili da individuare in seguito.

challenge icon

Sfida

Facile

Costruiamo un sistema di riproduzione multimediale che dimostri l'importanza dell'annotazione @override quando si personalizza il comportamento ereditato. Creerai diversi tipi di contenuti multimediali, ognuno dei quali riproduce i contenuti a modo proprio.

Organizzerai il codice in due file:

  • media.dart: definisci qui la gerarchia dei contenuti multimediali:
    • Una classe Media con una proprietà String title, un costruttore che accetta il titolo e un metodo play() che stampa Playing: [title]
    • Una classe Song che estende Media e aggiunge una proprietà String artist. Usa l'annotazione @override e sovrascrivi play() per stampare Playing song: [title] by [artist]
    • Una classe Video che estende Media e aggiunge una proprietà int duration (in secondi). Usa @override e sovrascrivi play() per chiamare prima la versione della classe genitore con super.play(), quindi stampare Duration: [duration] seconds
  • main.dart: importa il tuo file multimediale e mostra i metodi sovrascritti:
    • Crea un oggetto Media con il titolo 'Generic Content' e chiama play()
    • Stampa una riga vuota
    • Crea un Song con il titolo 'Imagine' e l'artista 'John Lennon', poi chiama play()
    • Stampa una riga vuota
    • Crea un Video con il titolo 'Dart Tutorial' e una durata di 360, poi chiama play()

L'annotazione @override documenta la tua intenzione e aiuta a individuare gli errori. Se per sbaglio scrivessi plya() invece di play(), l'annotazione ti avviserebbe che nella classe genitore non esiste un metodo con quel nome.

Risultato previsto:

Playing: Generic Content

Playing song: Imagine by John Lennon

Playing: Dart Tutorial
Duration: 360 seconds

Provalo tu

import 'media.dart';

void main() {
  // TODO: Crea un oggetto Media con titolo 'Generic Content' e chiama play()
  
  
  // TODO: Stampa una riga vuota
  
  
  // TODO: Crea un oggetto Song con titolo 'Imagine' e artista 'John Lennon', poi chiama play()
  
  
  // TODO: Stampa una riga vuota
  
  
  // TODO: Crea un oggetto Video con titolo 'Dart Tutorial' e durata 360, poi chiama play()
  
}
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