Menu
Coddy logo textTech

Klasy generyczne

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

Wiesz już, jak wbudowane kolekcje Dart, takie jak List<String>, używają parametrów typów. Teraz czas utworzyć własne klasy generyczne, które działają z dowolnym określonym przez Ciebie typem.

Klasa generyczna używa parametru typu (zazwyczaj T) jako symbolu zastępczego dla rzeczywistego typu, który zostanie podany podczas tworzenia instancji:

class Box<T> {
  T content;
  
  Box(this.content);
  
  T getContent() => content;
}

void main() {
  var stringBox = Box<String>('Hello');
  var intBox = Box<int>(42);
  
  print(stringBox.getContent());  // Hello
  print(intBox.getContent());     // 42
}

T pełni rolę zmiennej typu — gdy tworzysz Box<String>, każde T w klasie staje się String. Dzięki temu masz bezpieczeństwo typów bez pisania osobnych klas dla każdego typu.

Możesz użyć wielu parametrów typu, gdy Twoja klasa musi działać z więcej niż jednym typem:

class Pair<K, V> {
  K first;
  V second;
  
  Pair(this.first, this.second);
}

void main() {
  var pair = Pair<String, int>('age', 25);
  print('${pair.first}: ${pair.second}');  // age: 25
}

Klasy generyczne stanowią podstawę wielokrotnego użytku i bezpiecznego typowo kodu. Zamiast powielać logikę dla różnych typów lub tracić informacje o typie za pomocą dynamic, generyki pozwalają pisać elastyczny kod, który kompilator nadal może weryfikować.

challenge icon

Wyzwanie

Łatwy

Zbudujmy system pakowania prezentów, który wykorzystuje klasy generyczne do tworzenia elastycznych pojemników na różne typy elementów. Utworzysz generyczną klasę Wrapper, która może opakować dowolny typ zawartości, oraz klasę GiftBox z dwoma parametrami typu, aby połączyć prezent z wiadomością na kartce.

Podzielisz swój kod na dwa pliki:

  • wrapper.dart: Zdefiniuj tutaj swoje klasy generyczne:
    • Generyczna klasa Wrapper<T> z właściwością T content i konstruktorem. Dodaj metodę unwrap(), która zwraca zawartość, oraz metodę describe(), która wypisuje Wrapped: [content]
    • Generyczna klasa GiftBox<G, C> z dwiema właściwościami: G gift i C card. Dodaj konstruktor i metodę open(), która wypisuje Gift: [gift] w jednym wierszu, a Card: [card] w następnym wierszu
  • main.dart: Zaimportuj plik wrapper i zademonstruj działanie klas generycznych z różnymi typami:
    • Utwórz obiekt Wrapper<String> zawierający 'Chocolate' i wywołaj describe()
    • Utwórz obiekt Wrapper<int> zawierający 42 i wywołaj describe()
    • Utwórz obiekt Wrapper<double> zawierający 3.14 i wywołaj describe()
    • Wypisz pusty wiersz
    • Utwórz obiekt GiftBox<String, String> z prezentem 'Teddy Bear' i kartką 'Happy Birthday!', a następnie wywołaj open()
    • Wypisz pusty wiersz
    • Utwórz obiekt GiftBox<int, String> z prezentem 100 (oznaczającym kwotę na karcie podarunkowej) i kartką 'Congratulations!', a następnie wywołaj open()

Zwróć uwagę, że ta sama klasa Wrapper bez problemu działa z łańcuchami znaków, liczbami całkowitymi i liczbami zmiennoprzecinkowymi. Klasa GiftBox pokazuje, jak używać dwóch parametrów typu do łączenia różnych typów — prezent może być dowolnego typu, a wiadomość na kartce pozostaje łańcuchem znaków.

Oczekiwany wynik:

Wrapped: Chocolate
Wrapped: 42
Wrapped: 3.14

Gift: Teddy Bear
Card: Happy Birthday!

Gift: 100
Card: Congratulations!

Spróbuj swoich sił

import 'wrapper.dart';

void main() {
  // TODO: Utwórz Wrapper<String> zawierający 'Chocolate' i wywołaj describe()
  
  // TODO: Utwórz Wrapper<int> zawierający 42 i wywołaj describe()
  
  // TODO: Utwórz Wrapper<double> zawierający 3.14 i wywołaj describe()
  
  // TODO: Wypisz pusty wiersz
  
  // TODO: Utwórz GiftBox<String, String> z prezentem 'Teddy Bear' 
  // i kartką 'Happy Birthday!', a następnie wywołaj open()
  
  // TODO: Wypisz pusty wiersz
  
  // TODO: Utwórz GiftBox<int, String> z prezentem 100 
  // i kartką 'Congratulations!', a następnie wywołaj open()
}
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