Typy generyczne

Typy generyczne

Typy generyczne umożliwiają zbudowanie klas, które działają na jeszcze nie zdefiniowanym typie. Dzięki temu możemy przygotować klasy, których metody operują na specyficznym typie i umożliwiają statyczne sprawdzenia poprawności typów, czego nie można by osiągnąć operując na typie Object.

Typów generycznych często używamy w postaci list. W takich obiektach właśnie widzimy potęgę typów generycznych. Gdyby lista korzystała z typu object zamiast konkretnych typów moglibyśmy do listy dodać dowolny często nie odpowiedni obiekt.

W przypadku typów generycznych w czasie kompilacji każde wykorzystanie typu generycznego tworzy odpowiednią implementację z każdym konkretnym typem, na którym taki typ operuje.

Deklaracja typu generycznego

Przy deklaracji klasy wszystkie jej elementy muszą mieć sprecyzowany typ, aby móc go nie określać przy deklaracji. Konieczne jest nadanie mu jakiegoś aliasu, który to w deklaracji klasy będzie wykorzystywany zamiast typu. Alias ten jest zapisywany w nawiasach trójkątnych <>.

Wykorzystanie

Wykorzystanie klasy typu generycznego jest tak samo proste jak wykorzystanie listy, która właśnie takim typem jest, a więc przy deklaracji zmiennej specyfikujemy dla jakiego typy jest ta zmienna.

Ograniczenia

Różnorodność typów obsługiwanych przez nasz typ generyczny może być ograniczona. W tym celu po deklaracji naszej klasy wykorzystujemy słowo kluczowe where aliasTypu :

  • class – typ musi być typem referencyjnym
  • struct – typ musi być typem wartości
  • new() – typ musi posiadać publiczny konstruktor bez parametrów. To ograniczenie musi być stosowane na samym końcu listy ograniczeń
  • nazwaTypuBazowego lub NazwaInterfejsu – parametr musi dziedziczyć po klasie bazowej lub implementować interfejs

Przykładowa implementacja może wyglądać tak

 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *