Generic Yapılar

Çoğu zaman işlem yaptığımız metotlar parametre olarak belli tipleri içerisine alır ve bunlar üzerinden işlem yaparlar. Ancak bu metotları tip bağımsız yapmak mümkün Böyle birşey söz konusu olduğunda geçmiş zamanlarda benim de aklıma ilk gelen metotların parametrelerini object tipinden tanımlamak olmuştu. Ancak bu işlemin getirdiği bazı sıkıntılar söz konusu. Birincisi metotların parametrelerini object tanımladığınız ve bir veri göndermek istediğinizde ki bu veri değer tipki (int,string,double..) veya  referans tipli (class vs) olabilir, Değer tipli olursa değer boxing olarak adlandırdığımız bir casting işlemi söz konusu olacaktır ki bu maliyetli bir işlemdir. Bunun yanısıra Örneğin iki sayının birbiriyle eşitliğini sorguladığımız bir metot geliştiriyor olalım. Bu metotun parametreleri object tipinde olsun ve metot içerisinde kıyaslansın. Ancak  biz bu durumda metoda parametre olarak bir parametresine string diğerine ise int gönderebiliriz ve hata almayız ancak bu gibi durumlarda derleme aşamasında hatayı görmemiz
daha doğru olur.

.Net bunun için generic yapılar adında bir yapı geliştirmiştir ve tip bağımsız yapılar oluşturmayı sağlamıştır.


public static bool
areEqual<T>(T x, T y)

 {
     return x.Equals(y);
 }

yukarıda metot isminin yanına <T> şeklinde yazdığımız ifade T tipinde yeni bir tip tanımladığımızı ve bu tipin metot içerisinde geçerli olacağını belirtir. Parametreler de T tipinde parametreler olarak belirtilmiştir. Ancak jenerik tiplerde işlem uygularken uygun metotlar kullanılmalıdır.

Bu metodu çağırırken ise

Class1.areEqual(1, 2); veya Class1.areEqual(“A”, “B”); formunda yazmamız yeterli olacaktır. Ancak daha metotu çağırıken verilmesi gereken parametreleri garantilemek istersek

Class1.areEqual<int>(1,2); şeklinde bir gönderimi de tercih edebiliriz.

  • İstenildiği takdirde classları da jenerik olarak tanımlayabiliriz.

       class List<T>
              {
                        T t1;

                        public T Deger
                        {
                              get{return t1;}
                              set {t1 = value;}
                        }
                }

yukarıdaki classa ait bir nesne üretirken

List<string> obj = new List<string>(); şeklinde üretiriz bu üretme sonucunda class tanımında yer alan tüm T tipi string ile eşleşmiş olur.
List<int> obj2 = new List<int>(); ile de tüm Tleri int ile eşlemiş oluruz.

  • Aşağıda da iç içe class yapısı , bu classların jenerik yapısı ve bu classlardan nesne üretimi örneklenmiştir.

 

class Program
{
static void Main(string[] args)
{

disCls<string> o1 = new disCls<string>();
disCls<string>.IcCls<int> o2 = new disCls<string>.IcCls<int>();

Console.ReadKey();
}
}

class disCls<U>
{
public disCls()
{
Console.WriteLine(“Dıs calis constructur”);
}

public class IcCls<V> {

public IcCls()
{
Console.WriteLine(“İç sınıf constructor”);
}

}

}