Menu
Coddy logo textTech

Adnotacja @override

Część sekcji Programowanie obiektowe ścieżki Dart w Coddy. Lekcja 39 z 110.

Adnotacja @override to znacznik dobrej praktyki, który informuje Dart (i innych programistów), że celowo zastępujesz metodę z klasy nadrzędnej. Choć nadpisywanie metod działa bez niej, użycie @override zapewnia ważną dodatkową ochronę.

class Animal {
  String name;
  
  Animal(this.name);
  
  void speak() {
    print('$name makes a sound');
  }
}

class Dog extends Animal {
  Dog(String name) : super(name);
  
  @override
  void speak() {
    print('$name barks: Woof!');
  }
}

Adnotacja zapewnia dwie kluczowe korzyści. Po pierwsze, jasno dokumentuje Twoje zamiary — każda osoba czytająca kod od razu wie, że ta metoda istnieje w klasie nadrzędnej. Po drugie, analizator Dart ostrzeże Cię, jeśli metoda nadrzędna w rzeczywistości nie istnieje, dzięki czemu literówki i błędy podczas refaktoryzacji zostaną wykryte na wczesnym etapie.

Zastanów się, co się stanie, jeśli błędnie zapiszesz nazwę metody bez @override:

class Cat extends Animal {
  Cat(String name) : super(name);
  
  void speek() {  // Literówka! Bez @override nie ma ostrzeżenia
    print('$name meows');
  }
}

Bez adnotacji Dart zakłada, że tworzysz nową metodę o nazwie speek(). Dzięki @override analizator natychmiast zgłosi, że taka metoda nie istnieje w klasie nadrzędnej. Ta prosta adnotacja zapobiega subtelnym błędom, które później mogą być trudne do wykrycia.

challenge icon

Wyzwanie

Łatwy

Zbudujmy system odtwarzacza multimediów, który pokaże, jak ważna jest adnotacja @override podczas dostosowywania odziedziczonego zachowania. Utworzysz różne typy mediów, z których każdy odtwarza treści na swój sposób.

Podzielisz kod na dwa pliki:

  • media.dart: Zdefiniuj tutaj hierarchię mediów:
    • Klasa Media z właściwością String title, konstruktorem przyjmującym tytuł oraz metodą play(), która wyświetla Playing: [title]
    • Klasa Song, która rozszerza Media i dodaje właściwość String artist. Użyj adnotacji @override i przesłoń metodę play(), aby wyświetlała Playing song: [title] by [artist]
    • Klasa Video, która rozszerza Media i dodaje właściwość int duration (w sekundach). Użyj @override i przesłoń metodę play(), aby najpierw wywołać wersję z klasy nadrzędnej za pomocą super.play(), a następnie wyświetlić Duration: [duration] seconds
  • main.dart: Zaimportuj plik z mediami i zademonstruj przesłonięte metody:
    • Utwórz obiekt Media z tytułem 'Generic Content' i wywołaj play()
    • Wyświetl pusty wiersz
    • Utwórz obiekt Song z tytułem 'Imagine' i wykonawcą 'John Lennon', a następnie wywołaj play()
    • Wyświetl pusty wiersz
    • Utwórz obiekt Video z tytułem 'Dart Tutorial' i czasem trwania 360, a następnie wywołaj play()

Adnotacja @override dokumentuje Twoje zamiary i pomaga wykrywać błędy. Jeśli przypadkowo napiszesz plya() zamiast play(), adnotacja poinformuje Cię, że taka metoda nie istnieje w klasie nadrzędnej.

Oczekiwany wynik:

Playing: Generic Content

Playing song: Imagine by John Lennon

Playing: Dart Tutorial
Duration: 360 seconds

Spróbuj swoich sił

import 'media.dart';

void main() {
  // TODO: Utwórz obiekt Media z tytułem 'Generic Content' i wywołaj play()
  
  
  // TODO: Wypisz pustą linię
  
  
  // TODO: Utwórz obiekt Song z tytułem 'Imagine' i artystą 'John Lennon', a następnie wywołaj play()
  
  
  // TODO: Wypisz pustą linię
  
  
  // TODO: Utwórz obiekt Video z tytułem 'Dart Tutorial' i czasem trwania 360, a następnie wywołaj play()
  
}
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