Menu
Coddy logo textTech

Metody generyczne

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

Podobnie jak klasy mogą być generyczne, poszczególne metody również mogą mieć własne parametry typów. Jest to przydatne, gdy potrzebujesz elastycznej metody, ale nie chcesz, aby cała klasa była generyczna.

Metoda generyczna deklaruje swój parametr typu przed typem zwracanym:

T findFirst<T>(List<T> items) {
  return items.first;
}

void main() {
  var firstNumber = findFirst<int>([1, 2, 3]);
  var firstWord = findFirst<String>(['hello', 'world']);
  
  print(firstNumber);  // 1
  print(firstWord);    // cześć
}

Dart często potrafi wywnioskować typ na podstawie argumentów, więc nie zawsze musisz określać go jawnie:

var result = findFirst([10, 20, 30]);  // Dart wywnioskuje typ int

Metody generyczne są szczególnie przydatne w klasach, gdy tylko niektóre operacje wymagają elastyczności typów:

class Printer {
  void printItem<T>(T item) {
    print('Printing: $item');
  }
  
  List<T> duplicate<T>(T item, int count) {
    return List.filled(count, item);
  }
}

void main() {
  var printer = Printer();
  printer.printItem<String>('Hello');
  printer.printItem(42);  // Typ wywnioskowany jako int
  
  var copies = printer.duplicate('Hi', 3);
  print(copies);  // [Hi, Hi, Hi]
}

Metody generyczne zapewniają precyzyjną kontrolę nad bezpieczeństwem typów na poziomie metody, dzięki czemu klasy pozostają prostsze, a jednocześnie korzystają z kontroli typów podczas kompilacji.

challenge icon

Wyzwanie

Łatwy

Zbudujmy narzędzie do transformacji danych, które pokaże możliwości metod generycznych. Utworzysz klasę Transformer z metodami, które mogą działać z dowolnym typem, zapewniając elastyczność bez konieczności stosowania typów generycznych w całej klasie.

Podzielisz kod na dwa pliki:

  • transformer.dart: Utwórz klasę Transformer z następującymi metodami generycznymi:
    • T getFirst<T>(List<T> items) — zwraca pierwszy element z listy
    • T getLast<T>(List<T> items) — zwraca ostatni element z listy
    • List<T> repeat<T>(T item, int times) — tworzy listę zawierającą element powtórzony określoną liczbę razy
    • void printPair<A, B>(A first, B second) — wypisuje dwie wartości w formacie Pair: [first] and [second]
  • main.dart: Zaimportuj plik z transformerem i pokaż działanie każdej metody generycznej z różnymi typami:
    • Utwórz instancję Transformer
    • Użyj getFirst dla [10, 20, 30] i wypisz wynik
    • Użyj getFirst dla ['apple', 'banana', 'cherry'] i wypisz wynik
    • Użyj getLast dla [1.5, 2.5, 3.5] i wypisz wynik
    • Użyj repeat, aby utworzyć listę z 'Hi' powtórzonym 4 razy, i wypisz wynik
    • Użyj repeat, aby utworzyć listę z 7 powtórzonym 3 razy, i wypisz wynik
    • Użyj printPair z wartościami 'Name' i 42
    • Użyj printPair z wartościami 100 i true

Zwróć uwagę, że każda metoda deklaruje własny parametr lub parametry typu, dzięki czemu ten sam obiekt Transformer może działać z liczbami całkowitymi, ciągami znaków, liczbami zmiennoprzecinkowymi i wartościami logicznymi — przy pełnym bezpieczeństwie typów. Metoda printPair pokazuje użycie dwóch parametrów typu w jednej metodzie.

Oczekiwany wynik:

10
apple
3.5
[Hi, Hi, Hi, Hi]
[7, 7, 7]
Pair: Name and 42
Pair: 100 and true

Spróbuj swoich sił

import 'transformer.dart';

void main() {
  // Utwórz instancję Transformer
  var transformer = Transformer();

  // TODO: Użyj getFirst na [10, 20, 30] i wypisz wynik

  // TODO: Użyj getFirst na ['apple', 'banana', 'cherry'] i wypisz wynik

  // TODO: Użyj getLast na [1.5, 2.5, 3.5] i wypisz wynik

  // TODO: Użyj repeat, aby utworzyć listę z 'Hi' powtórzonym 4 razy, i ją wypisz

  // TODO: Użyj repeat, aby utworzyć listę z 7 powtórzonym 3 razy, i ją wypisz

  // TODO: Użyj printPair z 'Name' i 42

  // TODO: Użyj printPair z 100 i true
}
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