Generyczność - Krok Po Kroku [C#]


(TereskaBro) #1

Witam,

Musze zrozumieć generyczność. Nie jest to niestety dla mnie super jasne, dlatego będę wdzięczny jakiejś mądrej głowie za nieskomplikowane i proste wyjaśnienie (może z jakimś przykładem w C# jak już ktoś pisał kiedyś). Jak na razie czuje podobieństwo między generycznością a polimorfizmem, w zależności od wymagań przyjmuję odpowiednią formę, wprowadzam inta to przyjmuję typ int, a jak stringa to stringa itd. jednak jest to powierzchowne wyjaśnienie Będę wdzięczny za rozwinięcie tej myśli lub jej skreślenie jeśli jest błędna. Nasuwa mi się też pytanie: Kiedy warto z generyczności korzystać?

Pozdrawiam TB


(Marcin Obala) #2

Prosty przykład. Chcesz rozszerzyć działanie Listy lub słownika (Dictionary). Jak wiadomo Lista może być listą dowolnego typu. Chciałbyś w kodzie zastosować swoją własną listę, która będzie mogła przyjąć dowolny typ. 

Dodatkowo kolejny prosty przykład, sortowanie. Musisz napisać swoją własną funkcję sortowania (bo tak każą), pasowałoby żeby funkcja sortująca potrafiła sortować dowolne elementy (oczywiście trzeba później “powiedzieć” jak sortować te elementy). Mógłbyś napisać sortowanie, int, float, double, string a ktoś nagle będzie chciał posortować typ Point w zależności od odległości punktu od środka układu współrzędnych i będziesz musiał pisać kolejną funkcję zamiast wykorzystać istniejącą, która jest generyczna.

 

Dodatkowo jeszcze prostsze zastosowanie:

Zamiana elementów. Chciałbyś prostą funkcję która zamieni wartości dwóch zmiennych. Musiałbyś za każdym razem pisać tak:

int Temp = Pierwsza;
Pierwsza = Druga;
Druga = Temp;

float Temp = Pierwsza;
Pierwsza = Druga;
Druga = Temp;

double Temp = Pierwsza;
Pierwsza = Druga;
Druga = Temp;

string Temp = Pierwsza;
Pierwsza = Druga;
Druga = Temp;

Point Temp = Pierwsza;
Pierwsza = Druga;
Druga = Temp;

albo wystarczy zrobić tak:

static void Swap<T>(ref T Pierwsza, ref T Druga)
{
T Temp = Pierwsza;
Pierwsza = Druga;
Druga = Temp;
}

I później wywoływać

int A,B;
double C,D;
string E,F;
Point G,H;

Swap(ref A, ref B);
Swap(ref C, ref D);
Swap(ref E, ref F);
Swap(ref G, ref H);

(TereskaBro) #3

Super :slight_smile: Dzięki wielkie :smiley: Jednak jakaś Mądra Głowa się znalazła :smiley:

 

To może będziesz miał jakiś fajny pomysł jak w formsach pokazać generyczność? Jakąś fajną własną klase generyczną z metodami. Tylko jak fajnie, i może graficznie pokazac te generycznośc?