Menu
Coddy logo textTech

Parola chiave covariant

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

Quando esegui l'override di un metodo in una sottoclasse, Dart normalmente richiede che i tipi dei parametri corrispondano esattamente. Ma a volte vuoi che un metodo della sottoclasse accetti un tipo più specifico di quello della classe padre. La parola chiave covariant lo consente.

Considera uno scenario in cui una classe Animal ha un metodo che accetta un altro Animal:

class Animal {
  void chase(Animal other) {
    print('Chasing an animal');
  }
}

class Dog extends Animal {
  @override
  void chase(covariant Dog other) {
    print('Dog chasing another dog');
  }
}

Senza covariant, Dart si lamenterebbe perché Dog non è dello stesso tipo di Animal. Aggiungendo covariant prima del parametro, dici a Dart: "So che questo è più specifico e mi assicurerò che venga passato solo il tipo corretto."

È utile quando le sottoclassi dovrebbero logicamente funzionare solo con esemplari del proprio tipo:

void main() {
  Dog dog1 = Dog();
  Dog dog2 = Dog();
  
  dog1.chase(dog2);  // Funziona: Dog insegue un altro cane
}

Fai attenzione, però: usare covariant sposta la sicurezza dei tipi in fase di esecuzione. Se chiami il metodo tramite un riferimento al genitore con il tipo sbagliato, otterrai un errore in fase di esecuzione invece che un errore in fase di compilazione. Usalo quando sei sicuro dei tipi passati.

challenge icon

Sfida

Facile

Costruiamo un sistema di compatibilità tra animali domestici che usa la parola chiave covariant per assicurarsi che gli animali possano giocare solo con i propri simili. Creerai una gerarchia di animali domestici in cui ogni tipo ha un metodo playWith che accetta solo animali dello stesso tipo.

Organizzerai il codice in due file:

  • pets.dart: definisci qui la gerarchia degli animali domestici:
    • Una classe Pet con una proprietà String name e un costruttore. Includi un metodo playWith(Pet other) che stampa [name] plays with [other.name]
    • Una classe Cat che estende Pet e sovrascrive playWith usando la parola chiave covariant per accettare solo un Cat. Dovrebbe stampare [name] and [other.name] chase yarn together
    • Una classe Dog che estende Pet e sovrascrive playWith usando la parola chiave covariant per accettare solo un Dog. Dovrebbe stampare [name] and [other.name] fetch the ball together
    • Una classe Rabbit che estende Pet e sovrascrive playWith usando la parola chiave covariant per accettare solo un Rabbit. Dovrebbe stampare [name] and [other.name] hop around together
  • main.dart: importa il file degli animali domestici e mostra come ogni tipo di animale giochi esclusivamente con i propri simili:
    • Crea due oggetti Cat chiamati 'Whiskers' e 'Mittens', poi fai giocare Whiskers con Mittens
    • Crea due oggetti Dog chiamati 'Buddy' e 'Max', poi fai giocare Buddy con Max
    • Crea due oggetti Rabbit chiamati 'Flopsy' e 'Cotton', poi fai giocare Flopsy con Cotton

La parola chiave covariant permette a ogni sottoclasse di restringere il tipo del parametro da Pet al proprio tipo specifico, garantendo interazioni sicure dal punto di vista dei tipi tra animali domestici della stessa specie.

Output previsto:

Whiskers and Mittens chase yarn together
Buddy and Max fetch the ball together
Flopsy and Cotton hop around together

Provalo tu

import 'pets.dart';

void main() {
  // TODO: Crea due oggetti Cat chiamati 'Whiskers' e 'Mittens'
  // Poi fai giocare Whiskers con Mittens
  
  
  // TODO: Crea due oggetti Dog chiamati 'Buddy' e 'Max'
  // Poi fai giocare Buddy con Max
  
  
  // TODO: Crea due oggetti Rabbit chiamati 'Flopsy' e 'Cotton'
  // Poi fai giocare Flopsy con Cotton
  
}
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