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.
Wyzwanie
ŁatwyStwó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
Petz właściwościąString namei konstruktorem. Dodaj metodęplayWith(Pet other), która wyświetla[name] plays with [other.name] - Klasa
Cat, która rozszerzaPeti nadpisujeplayWith, używając słowa kluczowegocovariant, aby przyjmować tylko obiekt klasyCat. Powinna wyświetlać[name] and [other.name] chase yarn together - Klasa
Dog, która rozszerzaPeti nadpisujeplayWith, używając słowa kluczowegocovariant, aby przyjmować tylko obiekt klasyDog. Powinna wyświetlać[name] and [other.name] fetch the ball together - Klasa
Rabbit, która rozszerzaPeti nadpisujeplayWith, używając słowa kluczowegocovariant, aby przyjmować tylko obiekt klasyRabbit. Powinna wyświetlać[name] and [other.name] hop around together
- Klasa
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
Cato nazwach'Whiskers'i'Mittens', a następnie spraw, by Whiskers bawił się z Mittens - Utwórz dwa obiekty
Dogo nazwach'Buddy'i'Max', a następnie spraw, by Buddy bawił się z Max - Utwórz dwa obiekty
Rabbito nazwach'Flopsy'i'Cotton', a następnie spraw, by Flopsy bawił się z Cotton
- Utwórz dwa obiekty
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 togetherSpró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
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy OOP
Pliki zewnętrzneBiblioteki i importyWprowadzenie do OOPKlasy a obiektySłowo kluczowe thisMetodyZmienne instancjiPodstawy konstruktorówPowtórka – prosty kalkulator4Bezpieczeństwo wartości null
Wprowadzenie do bezpieczeństwa wartości nullTypy dopuszczające null i niedopuszczające nullOperatory ? i !Słowo kluczowe late a bezpieczeństwo wartości nullOperatory uwzględniające nullBezpieczeństwo wartości null w klasachPodsumowanie — system profili użytkowników7Klasy abstrakcyjne i interfejsy
Klasy abstrakcyjneMetody abstrakcyjneInterfejsy w DartInterfejsy niejawneImplementowanie a rozszerzanieWiele interfejsówPowtórka — kalkulator kształtów10Kolekcje i typy generyczne
Przegląd List, Set i MapKolekcje bezpieczne typowoKlasy generyczneMetody generyczneOgraniczenia typów generycznychIterable i IteratorPowtórka — generyczne przechowywanie danych13Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieMetody rozszerzająceKlasy wywoływalneKlasy zapieczętowane (Dart 3)Rekordy (Dart 3)Wzorce i dopasowywanie (3.0)Typy wyliczeniowe z metodami16Projekt: Zarządzanie biblioteką
Omówienie projektuKlasy książek i użytkowników2Konstruktory w Dart
Konstruktor domyślnyKonstruktory nazwaneListy inicjalizująceKonstruktory stałeKonstruktory fabryczneKonstruktory przekierowującePodsumowanie — budowanie kształtów5Hermetyzacja
Elementy publiczne a prywatneKonwencja prefiksu _Prywatność na poziomie bibliotekiGettery i settery — szczegółowoUkrywanie informacjiPodsumowanie — dane uczniów8Domieszki
Wprowadzenie do domieszekTworzenie domieszekKorzystanie z wielu domieszekSłowo kluczowe on w domieszkachDomieszka a dziedziczenieDomieszka a interfejsPodsumowanie – system zwierząt11Metody specjalne
Nadpisanie toString()Nadpisanie hashCode i ==Interfejs ComparableMetoda call()Nadpisanie noSuchMethodPodsumowanie — własna kolekcja14Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec Strategy3Właściwości klas
Elementy instancji a elementy statycznePola final i constZmienne inicjalizowane z opóźnieniemMetody i pola statyczneGettery i setteryPowtórzenie – menedżer kont bankowych6Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe superPrzesłanianie metodAdnotacja @overrideSłowo kluczowe final dla klasKonstruktory i dziedziczeniePowtórzenie – hierarchia pracowników9Polimorfizm
Podstawy polimorfizmuPolimorfizm za pomocą interfejsówSprawdzanie typu w czasie działaniaOperatory is i asSłowo kluczowe covariantPodsumowanie — procesor płatnościPoćwicz samodzielnie: Kompilator Dart online