Generiká sú vlastnosť jazyka C#, ktorá triedam dovoľuje modifikovať sa podľa cieľového dátového typu. Vďaka tomu ich nie je nutné upravovať pre každý dátový typ zvlášť.
Vďaka generikám môžeme tvoriť univerzálne triedy, ktoré budú fungovať s rôznymi typmi, ktoré spolu nemusia súvisieť.
Často používané generické typy
Najčastejšie používanými generickými typmi sú List a Dictionary – čiže zoznam a slovník. List je vylepšené pole, pokiaľ by ste totiž chceli zväčšiť alebo zmenšiť veľkosť pola, mali by ste s tým dosť práce. List má túto funkcionalitu v sebe implementovanú. Objekt generického typu je možné vytvoriť ako každý iný, je však nutné špecifikovať, aký typ bude využívať.
List<string> list = new List<string>();
Takto vytvoríme objekt typu List, ktorý ako základ používa string. To je zadané práve v lomených zátvorkách. Tento List je vlastne rozšíriteľné pole premenných typu string. Ak doň chcete pridať ďalší string, môžete použiť metódu Add list.Add(„text“); – tým na koniec zoznamu pridáte string „text“. Získať objekty z listu je možné jednoducho použitím hranatých zátvoriek a indexu ako pri klasickom poly Console.WriteLine(list[0]); . Do Listu je možné pridávať aj celé polia alebo listy použitím metódy AddRange.
Typ Dictionary je ešte pokročilejší a používa až dva pomocné typy. Na vytvorenie objektu typu Dictionary ich musíte špecifikovať oba.
Dictionary<string, int> veky = new Dictionary<string, int>();
Prvý typ – string označuje kľúč slovníka, druhý typ obsah. Metóda Add má ako parameter vždy obidva zadané typy veky.Add(„Jack Harkness“, 48); . Ak chcete nejakú premennú použiť, dostanete sa k nej pomocou kľuča Console.WriteLine(veky[„Jack Harkness“]); . Slovník vlastní pole Keys, ktoré obsahuje všetky použité kľúče a zároveň aj funkciu ContainsKey, ktorá vráti bool hodnotu, ak slovník obsahuje daný kľúč.
Tvorba vlastných generík
Ako vytvoriť generickú triedu si už pravdepodobne môžete domyslieť podľa toho čo viete. Prebieha to ako pri tvorbe triedy s tým, že ju informujete o tom, že sa jedná o generickú triedu použitím šikmých zátvoriek a špecifikáciou mena, ktorým budete označovať generický typ.
public class VlastnaTrieda<T> { }
Týmto ste definovali generickú triedu a písmeno T bude používané ako typ zadaný používateľom pri tvorbe triedy.
public class VlastnaTrieda<T> { T vec; public void NastavHodnotu(T value) { vec = value; } public T ZiskajHodnotu() { return vec; } }
Ako môžete vidieť, T je používané ako keby to bol typ. Pokiaľ by ste pri inicializácií inštancie triedy VlastnaTrieda zadali ako typ string, premenná vec by mala tiež typ string a všade, kde je použité T by bol použitý práve typ String. Pokiaľ by ste chceli špecifikovať viac vstupných typov, môžete to spraviť tým, že ich oddelíte čiarkou.
Ako generické, je možné označiť aj samotné metódy, ktoré následne môžu odlišne spracovávať dáta.
Podmienenie typu generického vstupu
Ak chcete, aby bol typ vstupnej premennej spĺňal isté podmienky, je možné použiť slovo where. Tým môžete špecifikovať, že typ musí byť odvodený od inej triedy, alebo rozhrania.
public class VlastnaTrieda<T> where T : IComparable { }
V tomto prípade musí byť vstupný typ T odvodený od rozhrania IComparable, ktoré zabezpečuje, že typ bude porovnateľný.
To by bolo k dnešnému dielu zameranému na generiká všetko a nabudúce sa pravdepodobne pozrieme na nahradenie operátorov v triedach.