Menu
Coddy logo textTech

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ść.

challenge icon

Wyzwanie

Łatwy

Zbudujmy 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 polami String sender i String content. Dodaj konstruktor przyjmujący obie wartości oraz metodę display(), która wyświetla From [sender]: [content]
    • Klasa UrgentMessage, która rozszerza Message. Powinna mieć dodatkowe pole String 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 wierszu Priority: [priority]
  • main.dart: Zaimportuj plik z wiadomościami i pokaż, jak działa super w konstruktorach i metodach:
    • Utwórz zwykłą wiadomość Message od 'Alice' o treści 'Hello there!'
    • Wywołaj jej metodę display()
    • Wyświetl pusty wiersz jako separator
    • Utwórz wiadomość UrgentMessage od 'Bob' o treści 'Server is down!' i priorytecie 'HIGH'
    • Wywołaj jej metodę display()

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: HIGH

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