Dizajniranje Softvera

Vežbe | 4. termin

Generički tipovi

Klase

U sledećem primeru je prikazana definicija generičke klase sa jednim tip-parametrom (type parameter):

class Point2D<T>
{
    T x;
    T y;

    public Point2D(T x, T y) {
        this.x = x;
        this.y = y;
    }
}

Datu klasu možemo koristiti na sledeći način, tako da čuva različite tipove podataka:

Point2D<int> p1 = new Point2D<int>(5, 7);
Point2D<float> p2 = new Point2D<float>(0.5f, 0.7f);

Takođe, možemo koristiti var umesto da navodimo tipove promenljivih, jer u ovom slučaju kompajler može sam zaključiti koji su tipovi u pitanju:

var p1 = new Point2D<int>(5, 7);
var p2 = new Point2D<float>(0.5f, 0.7f);

U narednom primeru ćemo isto definisati generičku klasu, ali ćemo imati dva type parametra:

class Pair<T1, T2>
{
    T1 first;
    T2 second;

    public Pair(T1 f, T2 s) {
        this.first = f;
        this.second = s;
    }
}

Sada možemo demonstrirati kako možemo koristiti ovu klasu:

var pair1 = new Pair<string, int>("Year", 2023);
var pair2 = new Pair<int, Point2D<float>>("Tačka A", new Point2D<float>(5f, 7f););
var pair3 = new Pair<int, int>(33, 2019);

Možemo primetiti da poslednji Pair objekat ima iste tipove za T1 i T2 type parametre, što je potpuno u redu.

Metode

public static T Distance<T>(Pair<Point2D<T>, Point2D<T>> line) 
{
    // do something
}

Delegati

Ograničenja generičkih tipova

Kod Značenje
where T: struct T mora biti vrednosni tip (onaj koji se prenosi po vrednosti)
where T: class T mora biti referencni tip (onaj koji se prenosi po referenci)
where T: new() T mora biti biti tip koji ima javni podrazumevani konstruktor
where T: Klasa T mora biti tip koji nasleđuje klasu Klasa
where T: Interfejs T mora biti tip koji implementira interfejs Interfejs

Predikati

Predikat u matematici je funkcija koja mapira parametar u true ili false.

U C#, Predicate je delegat definisan u System namespace-u. Po definiciji, prima jedan parametar generičkog tipa i vraća bool.


«< 3. Termin