Skip to content

Креирање генеричких класа и метода

Да се подсетимо, класе које се баве колекцијама података (листа, стек, ред, речник…) имају додатни параметар (параметре) означен <> заградама. Тај параметар зовемо генерички параметар типа или само генерички параметар јер представља тип вредности који се складишти у колекцији. Може да постоји више генеричких параметара, као у случају речника – један за кључ, други за вредност. Све типове који имају могућност задавања генеричких параметара зовемо генеричким типовима. Класе генеричких типова налазе се у System.Collections.Generic именском простору.

Генерички типови нам олакшавају рад са колекцијама података, омогућавају да пишемо јасан и чист код и повећавају безбедност (интегритет) типова. Интегритет типа гарантује да ће нека вредност бити одређеног типа и да програмер може бити сигуран да коришћењем тог типа програм неће изазвати неочекивано понашање. Са генерицима не постоји могућност уноса погрешног типа јер генерички параметар гарантује да ће колекција садржати само тип који смо задали између <> заграда. Уколико покушамо да унесемо тип који не одговара, добићемо грешку током компајлирања.

C# нам омогућује да креирамо сопствене генеричке класе:

using System;

// Uvek koristite List<T> - ovaj kod je samo za demonstraciju!

// Deklarisanje generičke klase MojaLista
public class MojaLista<T>
{
    public void Dodaj(T ulaz) 
    {

    }
}

class TestMojeListe
{
    static void Main(string[] args)
    {
        // Deklarisanje liste MojaLista tipa int
        MojaLista<int> lista1 = new MojaLista<int>();
        lista1.Dodaj(128);

        // Deklarisanje liste MojaLista tipa double
        MojaLista<double> lista2 = new MojaLista<double>();
        lista2.Dodaj(3.14);

        // Deklarisanje liste MojaLista tipa string
        MojaLista<string> lista3 = new MojaLista<string>();
        lista3.Dodaj("Pozdrav!");
    }
}

Задатак: Креирајте генеричку класу која у конзоли исписује добијене вредности:

using System;

public class GenerickaKlasa<T>
{
    private T vrednost;
    public GenerickaKlasa(T t)
    {
        this.vrednost = t;
    }
    public void ispisi()
    {
        Console.WriteLine("Ispisujem: {0}", this.vrednost);
    }
}
class TestGenerickeKlase
{
    static void Main(string[] args)
    {
        GenerickaKlasa<int> primer1 = new GenerickaKlasa<int>(128);
        primer1.ispisi();

        GenerickaKlasa<double> primer2 = new GenerickaKlasa<double>(3.14);
        primer2.ispisi();

        GenerickaKlasa<string> primer3 = new GenerickaKlasa<string>("Pozdrav");
        primer3.ispisi();
    }
}

Методе у оквиру једне класе могу да буду генеричке методе и ако класа није генеричка.

using System;


class TestGenerickeМетоде
{
    static void ispisi(string levo, string desno)
    {
        Console.WriteLine(levo + " " + desno);
    }

    static void zameni<T>(ref T levo, ref T desno)
    {
        T temp;
        temp = levo;
        levo = desno;
        desno = temp;
    }

    static void Main(string[] args)
    {
        string ime = "Velimir";
        string prezime = "Radlovački";

        Console.WriteLine("Ime i prezime:");
        ispisi(ime, prezime);

        Console.WriteLine("Zamena mesta:");
        zameni<string>(ref ime, ref prezime);
        ispisi(ime, prezime);
    }
}