.NET içinde hazır gelen bir çok Generic Class vardır. Örneğin List<T> bunlardan en çok kullanılanıdır. Burada "< >" işaretleri arasında yazılan T, List Class’ının içinde T tipinde değerler tutacağını belirtir.List<T> gibi collection tipleri dışında IComparer veya IComparable gibi Interface’lerin IComparer<T>ve IComparable<T> gibi Generic olanlarıda vardır.
Kullanımına bir kaç örnek vericek olursak;
1- )
List<Rectangle> listRect = new List<Rectangle>(); Rectangle rect = new Rectangle(10,10,100,25); listRect.Add(rect); // parametre olarak sadece Rectangle tipinde değeler alır. |
public class ButtonComparer : IComparer<Button> { #region IComparer<Button> Members public int Compare(Button x,Button y) { return x.Text.CompareTo(y.Text); } #endregion } |
public class MyGeneric<Tip> { private Tip genericValue; public MyGeneric() { } public MyGeneric(Tip genericValue) { this.genericValue = genericValue; } public Tip GenericValue { get { return genericValue; } set { genericValue = value; } } public void writeGenericType() { Console.WriteLine(genericValue.GetType().ToString()); } public void writeGenericValue() { Console.WriteLine(genericValue.ToString()); } } |
MyGeneric<DateTime> temp = new MyGeneric<DateTime>(DateTime.Now); temp.writeGenericType(); temp.writeGenericValue(); veya MyGeneric<DateTime> temp = new MyGeneric<DateTime>(); temp.GenericValue = DateTime.Now; temp.writeGenericType(); temp.writeGenericValue(); |
Koşullu Generic tipler
Kendi Generic Class’larımızı yazarken, bir önceki örnekte Tip ile belirttiğimiz generic tipin, belirli bir class’tan türemesi veya mutlaka parametresiz bir constructor’ı olması koşullarını belirtebiliriz. Böylece daha güçlü Generic Class tipleri yazma imkanımız olur. Bu özellik önceki versiyonlarda bulunmayan where keyword’ü ve mevcut new keyword’ünün başka bir kullanımını ile uygulanır. Bunu biraz önceki örnek kod üzerinde uygulayalım;public class MyClass { private string text; public string Text { get { return text; } set { text = value; } } } public class MyGeneric<Tip> where Tip : MyClass { // Bazı kodlar } |
public class MyClass { private string text; public string Text { get { return text; } set { text = value; } } } public interface MyInterface { } public class MyGeneric<Tip> where Tip : MyClass,MyInterface { // Bazı kodlar } //veya public class MyGeneric<Tip> where Tip : MyClass,MyInterface,IClonable<Tip> { // Bazı kodlar } |
public class MyGeneric<Tip> where Tip : new() { // Bazı kodlar } // veya önceki örnekle birleştirirsek; public class MyGeneric<Tip> where Tip : MyClass,MyInterface,new() { // Bazı kodlar } |
Konuyu ilk fark ettiğimde, parametresiz constructor olması koşulu gibi özellikle belli bir constructor’u olan generic tip koşulu tanımlamaya çalıştım ama olmadı :-). Oda olsa iyi olurmuş ama bu kadarı bile yeterince kolaylık sağlıyor. http://www.csharpnedir.com/articles/read/?id=566&title=C
Hiç yorum yok:
Yorum Gönder