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 intMetody 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.
Wyzwanie
ŁatwyZbudujmy 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ęTransformerz następującymi metodami generycznymi:T getFirst<T>(List<T> items)— zwraca pierwszy element z listyT getLast<T>(List<T> items)— zwraca ostatni element z listyList<T> repeat<T>(T item, int times)— tworzy listę zawierającą element powtórzony określoną liczbę razyvoid printPair<A, B>(A first, B second)— wypisuje dwie wartości w formaciePair: [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
getFirstdla[10, 20, 30]i wypisz wynik - Użyj
getFirstdla['apple', 'banana', 'cherry']i wypisz wynik - Użyj
getLastdla[1.5, 2.5, 3.5]i wypisz wynik - Użyj
repeat, aby utworzyć listę z'Hi'powtórzonym4razy, i wypisz wynik - Użyj
repeat, aby utworzyć listę z7powtórzonym3razy, i wypisz wynik - Użyj
printPairz wartościami'Name'i42 - Użyj
printPairz wartościami100itrue
- Utwórz instancję
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 trueSpró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
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy OOP
Pliki zewnętrzneBiblioteki i importyWprowadzenie do OOPKlasy a obiektySłowo kluczowe thisMetodyZmienne instancjiPodstawy konstruktorówPowtórka – prosty kalkulator4Bezpieczeństwo wartości null
Wprowadzenie do bezpieczeństwa wartości nullTypy dopuszczające null i niedopuszczające nullOperatory ? i !Słowo kluczowe late a bezpieczeństwo wartości nullOperatory uwzględniające nullBezpieczeństwo wartości null w klasachPodsumowanie — system profili użytkowników7Klasy abstrakcyjne i interfejsy
Klasy abstrakcyjneMetody abstrakcyjneInterfejsy w DartInterfejsy niejawneImplementowanie a rozszerzanieWiele interfejsówPowtórka — kalkulator kształtów10Kolekcje i typy generyczne
Przegląd List, Set i MapKolekcje bezpieczne typowoKlasy generyczneMetody generyczneOgraniczenia typów generycznychIterable i IteratorPowtórka — generyczne przechowywanie danych13Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieMetody rozszerzająceKlasy wywoływalneKlasy zapieczętowane (Dart 3)Rekordy (Dart 3)Wzorce i dopasowywanie (3.0)Typy wyliczeniowe z metodami16Projekt: Zarządzanie biblioteką
Omówienie projektuKlasy książek i użytkowników2Konstruktory w Dart
Konstruktor domyślnyKonstruktory nazwaneListy inicjalizująceKonstruktory stałeKonstruktory fabryczneKonstruktory przekierowującePodsumowanie — budowanie kształtów5Hermetyzacja
Elementy publiczne a prywatneKonwencja prefiksu _Prywatność na poziomie bibliotekiGettery i settery — szczegółowoUkrywanie informacjiPodsumowanie — dane uczniów8Domieszki
Wprowadzenie do domieszekTworzenie domieszekKorzystanie z wielu domieszekSłowo kluczowe on w domieszkachDomieszka a dziedziczenieDomieszka a interfejsPodsumowanie – system zwierząt11Metody specjalne
Nadpisanie toString()Nadpisanie hashCode i ==Interfejs ComparableMetoda call()Nadpisanie noSuchMethodPodsumowanie — własna kolekcja14Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec Strategy3Właściwości klas
Elementy instancji a elementy statycznePola final i constZmienne inicjalizowane z opóźnieniemMetody i pola statyczneGettery i setteryPowtórzenie – menedżer kont bankowych6Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe superPrzesłanianie metodAdnotacja @overrideSłowo kluczowe final dla klasKonstruktory i dziedziczeniePowtórzenie – hierarchia pracowników9Polimorfizm
Podstawy polimorfizmuPolimorfizm za pomocą interfejsówSprawdzanie typu w czasie działaniaOperatory is i asSłowo kluczowe covariantPodsumowanie — procesor płatnościPoćwicz samodzielnie: Kompilator Dart online