Menu
Coddy logo textTech

Słowo kluczowe covariant

Część sekcji Programowanie obiektowe ścieżki Dart w Coddy. Lekcja 61 z 110.

Gdy przesłaniasz metodę w podklasie, Dart zwykle wymaga, aby typy parametrów dokładnie się zgadzały. Czasami jednak chcesz, aby metoda podklasy akceptowała bardziej szczegółowy typ niż metoda klasy nadrzędnej. Umożliwia to słowo kluczowe covariant.

Rozważmy sytuację, w której klasa Animal ma metodę przyjmującą inny obiekt klasy 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');
  }
}

Bez covariant Dart zgłosiłby, że Dog nie jest tego samego typu co Animal. Dodając covariant przed parametrem, mówisz Dartowi: „Wiem, że ten typ jest bardziej szczegółowy i dopilnuję, aby przekazywano tylko właściwy typ”.

Jest to przydatne, gdy podklasy logicznie powinny działać tylko z obiektami własnego typu:

void main() {
  Dog dog1 = Dog();
  Dog dog2 = Dog();
  
  dog1.chase(dog2);  // Działa: Dog goni innego psa
}

Zachowaj jednak ostrożność — użycie covariant przenosi sprawdzanie bezpieczeństwa typów na etap wykonywania programu. Jeśli wywołasz metodę za pośrednictwem referencji do klasy nadrzędnej, podając niewłaściwy typ, wystąpi błąd w czasie wykonywania zamiast błędu kompilacji. Używaj tego rozwiązania, gdy masz pewność co do przekazywanych typów.

challenge icon

Wyzwanie

Łatwy

Stwórzmy system zgodności zwierząt, który używa słowa kluczowego covariant, aby zwierzęta mogły bawić się tylko ze zwierzętami swojego gatunku. Utworzysz hierarchię zwierząt, w której każdy typ ma metodę playWith przyjmującą tylko zwierzę tego samego typu.

Podzielisz swój kod na dwa pliki:

  • pets.dart: Zdefiniuj tutaj hierarchię zwierząt:
    • Klasa Pet z właściwością String name i konstruktorem. Dodaj metodę playWith(Pet other), która wyświetla [name] plays with [other.name]
    • Klasa Cat, która rozszerza Pet i nadpisuje playWith, używając słowa kluczowego covariant, aby przyjmować tylko obiekt klasy Cat. Powinna wyświetlać [name] and [other.name] chase yarn together
    • Klasa Dog, która rozszerza Pet i nadpisuje playWith, używając słowa kluczowego covariant, aby przyjmować tylko obiekt klasy Dog. Powinna wyświetlać [name] and [other.name] fetch the ball together
    • Klasa Rabbit, która rozszerza Pet i nadpisuje playWith, używając słowa kluczowego covariant, aby przyjmować tylko obiekt klasy Rabbit. Powinna wyświetlać [name] and [other.name] hop around together
  • main.dart: Zaimportuj plik ze zwierzętami i pokaż, jak każdy typ zwierzęcia bawi się wyłącznie ze zwierzętami swojego gatunku:
    • Utwórz dwa obiekty Cat o nazwach 'Whiskers' i 'Mittens', a następnie spraw, by Whiskers bawił się z Mittens
    • Utwórz dwa obiekty Dog o nazwach 'Buddy' i 'Max', a następnie spraw, by Buddy bawił się z Max
    • Utwórz dwa obiekty Rabbit o nazwach 'Flopsy' i 'Cotton', a następnie spraw, by Flopsy bawił się z Cotton

Słowo kluczowe covariant pozwala każdej podklasie zawęzić typ parametru z Pet do jej konkretnego typu, zapewniając bezpieczne pod względem typów interakcje między zwierzętami tego samego gatunku.

Oczekiwany wynik:

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

Spróbuj swoich sił

import 'pets.dart';

void main() {
  // TODO: Utwórz dwa obiekty Cat o nazwach 'Whiskers' i 'Mittens'
  // Następnie spraw, by Whiskers bawił się z Mittens
  
  
  // TODO: Utwórz dwa obiekty Dog o nazwach 'Buddy' i 'Max'
  // Następnie spraw, by Buddy bawił się z Max
  
  
  // TODO: Utwórz dwa obiekty Rabbit o nazwach 'Flopsy' i 'Cotton'
  // Następnie spraw, by Flopsy bawił się z Cotton
  
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Dart online