Da se podsetimo:

Pojam Generic se odnosi na neki opšti oblik (engl. general form). U C#-u se pojam generic odnosi na nešto što nije specifično za neki određeni tip podataka. Prilikom definisanja nekog generičkog elementa ne navodi se tip podataka već parametar tipa (engl. type parameter). Parametar tipa u stvari čuva mesto za neki konkretan tip podataka koji će da se specificira u momentu kreiranja instance generičkog tipa. 

Generičko tip se deklariše pisanjem parametra tipa u špicastim zagradama odmah posle imena tipa, kao na primer TypeName<T> gde je T parametar tipa

Generičke klase

Generičke klase se definišu tako što se u špicastim zagradama nakon imena klase koristi parametar tipa.

U nastavku je primer jedne generičke klase:

  class Podaci<T>
{
public T Stavka { get; set; }
}

U gornjem primeru je Podaci generička klasa. T je type parametar / parametar tipa. Parametar tipa može da se koristi kao tip atributa, propertija, parametar metoda, povratni tip ili delegat unutar klase Podaci). U ovom primeru, Stavka je generički properti jer smo umesto nekog konkretnog tipa koristili type parametar T.

Napomena: Nije obavezno pisati slovo T kao parametar tipa. Može se napisati bilo šta. Uobičajeno je da se piše T ako postoji samo jedan parametar tipa, a ako ih ima više, onda je preporučeno da se piše nešto u stilu Tbroj, TVrednost, TNiz  da bi bilo čitljivije.

Naravno, može da se definiše više generičkih parametara koji su razdvojeni zarezom.

Primer: Generička klasa sa više parametara tipa

class ParKljucVrednost <TDuzina, TSirina>
{
public TKljuc { get; set; }
public TVrednost { get; set; }
}
A kako da se kreira instanca generčke klase:

Kreiranje instance generičke klase se vrši jednostavno: unutar špicastih zagrada se specificira konkretan tip podataka. U nastavku je kreiranje instance generičke klase Podaci:

  Podaci<string> mojiPodaci = new Podaci<string>();

U ovom primeru je konkretan tip string postavljen u špicaste zagrade prilikom kreiranja instance. Prilikom kompajliranja će T da bude zamenjeno sa string svaki put gde se koristi T unutar cele klase. To takođe znači da će tip propertija Stavka biti string.

To je ilustrovano u sledećoj slici:

ilustracija kako je T zamenjeno sa string

Sada se propertiju Stavka može dodeliti neki string. Ako bi pokušali da ubacimo bilo šta što nije string dobili bi grešku prilikom kompajliranja.

  Podaci<string> mojiPodaci = new Podaci<string>();

mojiPodaci.Stavka = "moja poruka za radoznale";
// mojiPodaci.Stavka = 123; // compile-time error

Za različite objekte se mogu postaviti različiti tipovi podataka, kao što je pokazano u sledećim primerima:

  Podaci<string> intPodaci = new Podaci<int>();
intPodaci.Stavka = 153;
// strPodaci.Stavka = "poruka 2"; // compile-time error
  Podaci<int> mojiPodaci = new Podaci<string>();
mojiPodaci.Stavka = "moja poruka za radoznale";
// mojiPodaci.Stavka = 123; // compile-time error

  ParKljucVrednost<int, string> kv1 = new ParKljucVrednost<int, string>();
kv1.TKljuc = 100;
kv1.TVrednost = "Stotina";

  ParKljucVrednost<string, string> kv1 = new ParKljucVrednost<string, string>();
kv1.TKljuc = "IT";
kv1.TVrednost = "Informacione Tehnologije";

Karakteristike generičkih klasa:

  • Upotrebom generičkih klasa se može ponovo koristiti kod. Što je više različitih tipova koji se mogu koristiti, biće više i ponovnog korišćenja koda. Međutim, treba voditi računa da se ne izvrši previše uopštavanja jer bi u tom slučaju moglo biti teže razumevanje koda kao i njegovo buduće održavanje.
  • Generička klasa može da bude bazna klasa nekoj drugoj generičkoj ili negeneričkoj klasi, kao i apstraktnoj klasi.
  • Generička klasa može da nasleđuje neku drugu generičku ili negeneričku klasu ili apstraktnu klasu.

Generički atributi (Generic Fields)

Unutar generičke klase mogu da se nalaze i generički atributi. Oni, međutim, ne mogu da se inicijalizuju. (Razmislite zašto je tako?)

Primer generičkog atributa:

  class Podaci<T>
{
public T Stavka;
}

Primer generičkog niza:

  class Podaci<T>
{
public T[] Stavka = new T[10];
}
( U narednoj lekciji ćemo raditi generičke metode. )

Prednosti korišćenja generika:

  • Povećavaju ponovno korišćenje koda (reusability). Ne mora se pisati novi programski kod da bi se radilo sa drugim tipovima podataka
  • Generici su type-safe. Dobiće se greška prilikom kompajliranja ako se pokuša koristiti neki drugi tip podataka umesto onog koji je specificiran prilikom definisanja.
Last modified: Sunday, 12 September 2021, 5:10 PM