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.
public static T Distance<T>(Pair<Point2D<T>, Point2D<T>> line)
{
// do something
}
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 |
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
.