Menu
Coddy logo textTech

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à.

challenge icon

Sfida

Facile

Costruiamo 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 un String sender e un String content. Includi un costruttore che accetti entrambi i valori e un metodo display() che stampi From [sender]: [content]
    • Una classe UrgentMessage che estende Message. Dovrebbe avere una proprietà aggiuntiva String priority. Il costruttore accetta sender, content e priority, passando i primi due alla classe genitore usando super. Sovrascrivi il metodo display() per chiamare prima la versione della classe genitore usando super.display(), quindi stampare Priority: [priority] sulla riga successiva
  • main.dart: importa il file dei messaggi e mostra come funziona super sia nei costruttori sia nei metodi:
    • Crea un Message normale da 'Alice' con il contenuto 'Hello there!'
    • Chiama il suo metodo display()
    • Stampa una riga vuota come separatore
    • Crea un UrgentMessage da 'Bob' con il contenuto 'Server is down!' e priorità 'HIGH'
    • Chiama il suo metodo display()

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: HIGH

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