C# where keyword ile generic tiplere açılım kısıtlaması getirmek
C# dilinde generic bir türe herhangi bir türde açılım yapılabilir. Ancak geliştirici şayet isterse açılım yapılabilecek türlerde kısıtlamaya gidebilir. Bu kısıtlama açılım yapılabilecek türlerin belirli bir taban sınıftan türetilmesi ya da belirli bir arayüzü implemente etmesiyle gerçekleştirilir. Örneğin aşağıdaki kod’da CBase sınıfından türetilen veya ISample’dan implemente edilen sınıflarla yapılacak açılımlar geçerli diğerleri ise kısıtlama nedeniyle geçersizdir. Aykut TAŞDELEN
class CBase
{
}
class CDerive1 : CBase
{
}
class CDerive2 : CBase
{
}
class Test <T> where T : CBase
{
// Generic sınıf
}
////////////////////////////////////////
interface ISample
{
}
class A : ISample
{
}
class B : ISample
{
}
class Deneme<K> where K : ISample
{
// Generic sınıf 2
}
class Ornek<K> where K : ISample
{
// Generic sınıf 2
}
class Program
{
static void Main(string[] args)
{
Test<CBase> t1 = new Test<CBase>();
Test<CDerive1> t2 = new Test<CDerive1>();
Test<CDerive2> t3 = new Test<CDerive2>();
//Test<string> t4 = new Test<string>();
// Geçersiz açılım: string CBase'den türetilmiş bir sınıf değil
//Test<Date> t5 = new Test<Date>();
//Geçersiz açılım: Date CBase'den türetilmiş bir yapı değil
///////////////////////////////////////////////////////////////
Deneme<A> a = new Deneme<A>();
Deneme<B> b = new Deneme<B>();
//Deneme<CDerive1> c = new Deneme<CDerive1>();
//Deneme<CDerive2> d = new Deneme<CDerive2>();
//Geçersiz açılım: CDerive1 ve 2 sınıfları ISample interface'inden
// implemente edilmemiş
}
Aykut TAŞDELEN
C ve Sistem Programcıları Derneği Eğitmeni
