Słowo kluczowe super
Część sekcji Programowanie obiektowe ścieżki Dart w Coddy. Lekcja 37 z 110.
Słowo kluczowe super zapewnia klasie potomnej bezpośredni dostęp do klasy nadrzędnej. Widziałeś je już w konstruktorach w zapisie super(name), ale przydaje się również w innych kontekstach.
Gdy musisz wywołać konstruktor klasy nadrzędnej, super przekazuje argumenty w górę łańcucha dziedziczenia:
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);
}Słowo kluczowe super pozwala również uzyskać dostęp do metod i właściwości klasy nadrzędnej z poziomu klasy potomnej. Jest to szczególnie przydatne, gdy chcesz korzystać z zachowania klasy nadrzędnej równolegle z własnym:
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(); // Najpierw wywołaj metodę klasy nadrzędnej
print('$name says meow!');
}
}Gdy wywołujesz super.makeSound(), jawnie wywołujesz wersję metody z klasy nadrzędnej. Bez super wywołanie makeSound() odnosiłoby się do metody bieżącej klasy, co mogłoby spowodować nieskończoną rekurencję.
Traktuj super jak komunikat „użyj wersji mojego rodzica” — niezależnie od tego, czy chodzi o konstruktor, metodę, czy właściwość.
Wyzwanie
ŁatwyZbudujmy system wiadomości, który pokazuje, jak słowo kluczowe super pozwala klasom potomnym uzyskiwać dostęp do zachowania klasy nadrzędnej i je rozszerzać. Utworzysz hierarchię, w której różne typy wiadomości bazują na podstawowej klasie wiadomości.
Podzielisz kod na dwa pliki:
message.dart: Zdefiniuj tutaj klasy wiadomości:- Klasa
Message(nadrzędna) z polamiString senderiString content. Dodaj konstruktor przyjmujący obie wartości oraz metodędisplay(), która wyświetlaFrom [sender]: [content] - Klasa
UrgentMessage, która rozszerzaMessage. Powinna mieć dodatkowe poleString priority. Konstruktor przyjmuje nadawcę, treść i priorytet, przekazując dwie pierwsze wartości klasie nadrzędnej za pomocąsuper. Przesłoń metodędisplay(), aby najpierw wywołać wersję klasy nadrzędnej za pomocąsuper.display(), a następnie wyświetlić w kolejnym wierszuPriority: [priority]
- Klasa
main.dart: Zaimportuj plik z wiadomościami i pokaż, jak działasuperw konstruktorach i metodach:- Utwórz zwykłą wiadomość
Messageod'Alice'o treści'Hello there!' - Wywołaj jej metodę
display() - Wyświetl pusty wiersz jako separator
- Utwórz wiadomość
UrgentMessageod'Bob'o treści'Server is down!'i priorytecie'HIGH' - Wywołaj jej metodę
display()
- Utwórz zwykłą wiadomość
Zwróć uwagę, że UrgentMessage używa super na dwa sposoby: w konstruktorze, aby przekazać dane klasie nadrzędnej, oraz w przesłoniętej metodzie, aby uwzględnić wynik klasy nadrzędnej przed dodaniem własnego.
Oczekiwany wynik:
From Alice: Hello there!
From Bob: Server is down!
Priority: HIGHSpróbuj swoich sił
import 'message.dart';
void main() {
// TODO: Utwórz zwykły obiekt Message od 'Alice' z treścią 'Hello there!'
// TODO: Wywołaj metodę display() na wiadomości
// TODO: Wypisz pustą linię jako separator
// TODO: Utwórz obiekt UrgentMessage od 'Bob' z treścią 'Server is down!' i priorytetem 'HIGH'
// TODO: Wywołaj metodę display() na pilnej wiadomości
}
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