Menu
Coddy logo textTech

Metody rozszerzające

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

Czasami chcesz dodać funkcjonalność do klasy, której nie jesteś właścicielem — takiej jak wbudowane typy Dart String lub int. Nie możesz modyfikować ich kodu źródłowego, a dziedziczenie nie pomoże w przypadku klas finalnych. Właśnie w takich sytuacjach przydają się metody rozszerzające.

Rozszerzenia pozwalają dodawać nowe metody do istniejących typów bez ich modyfikowania ani tworzenia podklas:

extension StringExtras on String {
  String reverse() {
    return split('').reversed.join('');
  }
  
  bool get isPalindrome {
    var cleaned = toLowerCase().replaceAll(' ', '');
    return cleaned == cleaned.split('').reversed.join('');
  }
}

void main() {
  print('hello'.reverse());        // olleh
  print('radar'.isPalindrome);     // true
}

Składnia ma postać extension ExtensionName on Type. Wewnątrz definiujesz metody i gettery tak jak w zwykłej klasie. Po zdefiniowaniu te metody są dostępne we wszystkich instancjach tego typu, jakby były wbudowane.

Rozszerzenia działają na dowolnym typie, w tym na własnych klasach i typach generycznych:

extension IntExtras on int {
  int squared() => this * this;
}

extension ListExtras<T> on List<T> {
  T? get secondOrNull => length >= 2 ? this[1] : null;
}

void main() {
  print(5.squared());                    // 25
  print([1, 2, 3].secondOrNull);         // 2
}

Zauważ, że wewnątrz rozszerzenia this odnosi się do instancji, na której wywoływana jest metoda. Rozszerzenia to przejrzysty sposób na wzbogacanie istniejących typów przy zachowaniu uporządkowanego i czytelnego kodu.

challenge icon

Wyzwanie

Łatwy

Ulepszmy wbudowane typy Dart, dodając do nich przydatne funkcje za pomocą metod rozszerzających! Utworzysz rozszerzenia dodające pomocne metody do typów String i List, a następnie użyjesz ich w pliku głównym.

Podzielisz swój kod na dwa pliki:

  • extensions.dart: Utwórz dwa rozszerzenia dodające nowe możliwości do istniejących typów:
    • Rozszerzenie o nazwie StringUtils dla typu String, zawierające:
      • Metodę countVowels(), która zwraca liczbę samogłosek (a, e, i, o, u — bez rozróżniania wielkości liter) w ciągu znaków
      • Getter initials, który zwraca pierwszą literę każdego słowa (podzielonego spacjami), połączone litery zapisane wielkimi literami. Na przykład "hello world" zmienia się w "HW"
    • Rozszerzenie o nazwie ListUtils<T> dla typu List<T>, zawierające:
      • Metodę safeGet(int index), która zwraca element o podanym indeksie, jeśli istnieje, lub null, jeśli indeks jest poza zakresem
      • Getter hasMultiple, który zwraca true, jeśli tablica zawiera więcej niż jeden element
  • main.dart: Zaimportuj swoje rozszerzenia i pokaż je w działaniu:
    • Utwórz ciąg znaków "Object Oriented Programming" i wypisz liczbę samogłosek w formacie: Vowels: [count]
    • Wypisz inicjały tego samego ciągu znaków w formacie: Initials: [initials]
    • Utwórz tablicę liczb całkowitych [10, 20, 30]
    • Wypisz wynik działania safeGet(1) w formacie: Element at 1: [value]
    • Wypisz wynik działania safeGet(5) w formacie: Element at 5: [value]
    • Wypisz informację, czy tablica zawiera wiele elementów, w formacie: Has multiple: [true/false]

Pamiętaj, że wewnątrz rozszerzenia this odnosi się do instancji, na której wywoływana jest metoda. Dzięki rozszerzeniom te typy będą sprawiać wrażenie, jakby te metody były wbudowane!

Oczekiwany wynik:

Vowels: 9
Initials: OOP
Element at 1: 20
Element at 5: null
Has multiple: true

Spróbuj swoich sił

import 'extensions.dart';

void main() {
  // Utwórz łańcuch znaków
  String text = "Object Oriented Programming";

  // TODO: Wypisz liczbę samogłosek, używając countVowels()
  // Format: Samogłoski: [count]

  // TODO: Wypisz inicjały, używając gettera initials
  // Format: Inicjały: [initials]

  // Utwórz listę liczb całkowitych
  List<int> numbers = [10, 20, 30];

  // TODO: Wypisz wynik safeGet(1)
  // Format: Element at 1: [value]

  // TODO: Wypisz wynik safeGet(5)
  // Format: Element at 5: [value]

  // TODO: Wypisz, czy lista ma więcej niż jeden element
  // Format: Has multiple: [true/false]
}
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