Przesłanianie metod
Część sekcji Programowanie obiektowe ścieżki Dart w Coddy. Lekcja 38 z 110.
Przesłanianie metod występuje, gdy klasa potomna dostarcza własną implementację metody, która już istnieje w klasie nadrzędnej. Dzięki temu podklasy mogą dostosowywać odziedziczone zachowanie, zachowując ten sam podpis metody.
Gdy zdefiniujesz metodę w klasie potomnej o tej samej nazwie i tych samych parametrach co metoda w klasie nadrzędnej, wersja z klasy potomnej ją zastępuje:
class Animal {
String name;
Animal(this.name);
void speak() {
print('$name makes a sound');
}
}
class Dog extends Animal {
Dog(String name) : super(name);
void speak() {
print('$name barks: Woof!');
}
}
void main() {
var animal = Animal('Generic');
var dog = Dog('Buddy');
animal.speak(); // Generic wydaje dźwięk
dog.speak(); // Buddy szczeka: Woof!
}Gdy wywołasz speak() na instancji Dog, Dart wykona wersję klasy Dog, a nie klasy Animal. Klasa potomna nadpisała metodę klasy nadrzędnej.
Możesz również połączyć nadpisywanie z super, aby rozszerzyć zachowanie klasy nadrzędnej, zamiast je zastępować:
class Cat extends Animal {
Cat(String name) : super(name);
void speak() {
super.speak(); // Najpierw wywołaj wersję z klasy nadrzędnej
print('$name also purrs');
}
}Ten wzorzec pozwala rozbudowywać istniejącą funkcjonalność. Główna zasada jest prosta: metoda o tej samej nazwie i tych samych parametrach w klasie potomnej zastępuje implementację klasy nadrzędnej, gdy jest wywoływana na instancjach klasy potomnej.
Wyzwanie
ŁatwyZbudujmy system powiadomień, który pokazuje, jak klasy potomne mogą nadpisywać metody klas nadrzędnych, aby dostosować ich działanie. Utworzysz różne typy powiadomień, z których każdy będzie dostarczać wiadomości na swój własny sposób.
Podzielisz kod na dwa pliki:
notification.dart: Zdefiniuj tutaj hierarchię powiadomień:- Klasa
Notification(nadrzędna) z polamiString titleiString message. Dodaj konstruktor przyjmujący obie wartości oraz metodęsend(), która wyświetlaNotification: [title] - [message] - Klasa
EmailNotification, która rozszerzaNotificationi dodaje właściwośćString recipient. Nadpisz metodęsend(), aby wyświetlałaSending email to [recipient]: [title] - [message] - Klasa
PushNotification, która rozszerzaNotificationi dodaje właściwośćString deviceId. Nadpisz metodęsend(), aby najpierw wywoływała metodęsend()klasy nadrzędnej za pomocąsuper, a następnie wyświetlałaPushed to device: [deviceId]w następnym wierszu
- Klasa
main.dart: Zaimportuj plik z powiadomieniami i pokaż działanie nadpisywania metod:- Utwórz podstawowy obiekt
Notificationz tytułem'Alert'i wiadomością'System update available' - Wywołaj jego metodę
send() - Wyświetl pusty wiersz
- Utwórz obiekt
EmailNotificationz tytułem'Welcome', wiadomością'Thanks for signing up!'i odbiorcą'user@example.com' - Wywołaj jego metodę
send() - Wyświetl pusty wiersz
- Utwórz obiekt
PushNotificationz tytułem'Reminder', wiadomością'Meeting in 10 minutes'i deviceId'DEVICE-001' - Wywołaj jego metodę
send()
- Utwórz podstawowy obiekt
Zwróć uwagę, że EmailNotification całkowicie zastępuje działanie klasy nadrzędnej, natomiast PushNotification rozszerza je, najpierw wywołując super.send(). Oba podejścia są poprawnymi sposobami nadpisywania metod — wybór zależy od Twoich potrzeb.
Oczekiwany wynik:
Notification: Alert - System update available
Sending email to user@example.com: Welcome - Thanks for signing up!
Notification: Reminder - Meeting in 10 minutes
Pushed to device: DEVICE-001Spróbuj swoich sił
import 'notification.dart';
void main() {
// TODO: Utwórz bazowy obiekt Notification z tytułem 'Alert' i wiadomością 'System update available'
// Wywołaj jego metodę send()
// TODO: Wypisz pustą linię
// TODO: Utwórz obiekt EmailNotification z następującymi wartościami:
// - title: 'Welcome'
// - message: 'Thanks for signing up!'
// - recipient: 'user@example.com'
// Wywołaj jego metodę send()
// TODO: Wypisz pustą linię
// TODO: Utwórz obiekt PushNotification z następującymi wartościami:
// - title: 'Reminder'
// - message: 'Meeting in 10 minutes'
// - deviceId: 'DEVICE-001'
// Wywołaj jego metodę send()
}
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