Menu
Coddy logo textTech

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.

challenge icon

Wyzwanie

Łatwy

Zbudujmy 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 polami String title i String message. Dodaj konstruktor przyjmujący obie wartości oraz metodę send(), która wyświetla Notification: [title] - [message]
    • Klasa EmailNotification, która rozszerza Notification i dodaje właściwość String recipient. Nadpisz metodę send(), aby wyświetlała Sending email to [recipient]: [title] - [message]
    • Klasa PushNotification, która rozszerza Notification i 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ła Pushed to device: [deviceId] w następnym wierszu
  • main.dart: Zaimportuj plik z powiadomieniami i pokaż działanie nadpisywania metod:
    • Utwórz podstawowy obiekt Notification z tytułem 'Alert' i wiadomością 'System update available'
    • Wywołaj jego metodę send()
    • Wyświetl pusty wiersz
    • Utwórz obiekt EmailNotification z 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 PushNotification z tytułem 'Reminder', wiadomością 'Meeting in 10 minutes' i deviceId 'DEVICE-001'
    • Wywołaj jego metodę send()

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-001

Spró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()
}
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