27.09. Ograničenja generičkih tipova
Ograničenja generičkih tipova omogućavaju programerima da definišu uslove koje generički tip mora ispunjavati. Ovo omogućava veću kontrolu nad generičkim tipovima i osigurava da se generički kod koristi sa tipovima koji ispunjavaju određene zahteve. Ova ograničenja pomažu u održavanju sigurnosti tipova i sprečavanju grešaka u kodu.
Ključne tačke o ograničenjima generičkih tipova:
-
Osnovna sintaksa: Ograničenja se definišu koristeći ključnu reč
whereprilikom deklaracije generičke klase, metode ili interfejsa.
public class MyGenericClass<T> where T : SomeBaseClass
{
// Kod klase
}
2. Vrste ograničenja:
-
Ograničenje na baznu klasu ili interfejs: Ovim ograničenjem se osigurava da generički tip bude ili izveden iz određene klase ili implementira određeni interfejs.
public class MyClass<T> where T : BaseClass
{
// T mora biti ili BaseClass ili klasa izvedena iz BaseClass
}
public class MyClass<T> where T : IMyInterface
{
// T mora implementirati IMyInterface
}
- Ograničenje na konkretni tip:
Ovim ograničenjem se omogućava samo korišćenje specifičnih tipova.
public class MyClass<T> where T : class // T mora biti referentni tip (klasa)
{
// Kod klase
}
public class MyClass<T> where T : struct // T mora biti vrednosni tip
{
// Kod klase
}
- Ograničenje na parameterless konstruktor:
Ovim ograničenjem se osigurava da generički tip ima podrazumevani konstruktor bez parametara, što omogućava kreiranje instanci tog tipa unutar generičke klase ili metode.
public class MyClass<T> where T : new()
{
public T CreateInstance()
{
return new T(); // T mora imati podrazumevani konstruktor
}
}
- Više ograničenja:
Možete kombinovati više ograničenja za jedan generički tip.
public class MyClass<T> where T : BaseClass, IMyInterface, new()
{
// T mora biti izveden iz BaseClass, implementirati IMyInterface i imati podrazumevani konstruktor
}
Primeri upotrebe ograničenja:
public class Repository<T> where T : IEntity
{
public void Save(T entity)
{
// Kod za čuvanje entiteta
}
}
public interface IEntity
{
int Id { get; set; }
}
public class User : IEntity
{
public int Id { get; set; }
public string Name { get; set; }
}
public class NumericOperations<T> where T : struct
{
public T Add(T a, T b)
{
// Operacije sa vrednosnim tipovima
}
}
public class Factory<T> where T : new()
{
public T Create()
{
return new T(); // Kreiranje instance T
}
}
Prednosti korišćenja ograničenja:
- Sigurnost tipova: Ograničenja osiguravaju da generički kod radi sa tipovima koji ispunjavaju određene zahteve.
- Veća kontrola: Omogućava veću kontrolu nad tipovima koji se koriste u generičkom kodu.
- Preprečavanje grešaka: Sprečava greške koje bi mogle nastati kada se generički tip koristi na način za koji nije predviđen.