You are on page 1of 12

ncelikle CollectionBase snfnn yapsn biraz inceleyelim; CollectionBase snf soyut (abstract) bir snftr.

Dolaysyla bu snfn bir rneini oluturup kullanmamz mmkn deil. Kendi koleksiyonumuzu oluturmak iin ilk yapmamz gereken ey, yeni bir snf tanmlamak ve bu snf CollectionBase snfndan tretmek. CollectionBase, koleksiyona e eklemek, karmak ve belirtilen bir nesnenin koleksiyonda bulunup bulunmadn renebilmek iin bir takm metodlar ierir. Birazdan teker teker uygulayacamz bu metodlarn tm IList arayzne ait metodlardr. CollectionBase snfndan trettiimiz koleksiyon snflarnda, saydmz ilemleri gerekletirebilmek iin, CollectionBasein List zelliinden faydalanlr. List zellii sayesinde yeni bir koleksiyon oluturmak gerekten ok kolaydr. rneimizde, ierisinde sadece Kitap snfndan oluturulmu kitap nesnelerinin saklanmasna izin veren yeni bir koleksiyon oluturacaz. Daha sonra bu koleksiyona farkl ekilde kitap nesneleri ekleyen, kitap ismine gre koleksiyon ierisinde tarama yapan, standart koleksiyonlarda bulunmayan yeni metodlar tanmlayacaz. Koleksiyon snfmz oluturmadan nce, koleksiyon ierisinde saklayacamz Kitap nesnelerin tanmn yapalm. using System; namespace Koleksiyonlar { /// <summary> /// KitapKoleksiyonunu test etmek iin /// tanmladmz zel snf. /// </summary> public class Kitap { public Kitap() {} public Kitap(string KitapAdi, string Yazar, DateTime BasimTarihi) { this.KitapAdi = KitapAdi; this.Yazar = Yazar; this.BasimTarihi = BasimTarihi; } public string KitapAdi; public string Yazar; public DateTime BasimTarihi;

} } Koleksiyon ierisinde saklanacak Kitap nesnelerinin tanm Oluturacamz KitapKoleksiyonu adndaki koleksiyon, ierisinde sadece yukarda tanmladmzKitap snfndan oluturulmu nesnelerin saklanmasna izin verecek. Farkl bir veri tipinde nesne eklenmek istenirse bir hata (exception) frlatlacak. imdi adm adm koleksiyonumuzu oluturalm; lk yapmamz gereken, bir snf tanmlamak ve bu snfCollectionBaseden tretmek: using System; using System.Collections; namespace Koleksiyonlar { public class KitapKoleksiyonu : CollectionBase { public KitapKoleksiyonu() {} } } KitapKoleksiyonu snfnn tanm Snf tanmn yaptktan sonra, koleksiyona ilerlik kazandrmak iin IList arayz ierisinde tanmlanan veCollectionBasein List zellii ile bize sunulan metodlar uygulamaya balayabiliriz. Uygulayacamz ilk metod bir koleksiyona e eklenmesini salayan IList.Add metodu: public int Add(Kitap value) { return (List.Add(value)); } KitapKoleksiyonu.Add Koleksiyona e eklemek iin gerekli olanAdd metodunun tanmn yaptk. Metodun ne kadar ksa olduunu farketmisinizdir. Belirtilen enin listeye eklenmesi iin CollectionBase tarafndan bize devredilenList zelliinin Add metodunu kullanmamz yeterli. List zellii enin saklanmas iini bizim iin hallediyor. Burada dikkat edilmesi gereken nokta, Add metodunun parametresinde eklenecek olan enin veri tipini ArrayList ve dier koleksiyonlarda olduu gibi object olarak tanmlamam olmamz. Bizim yaptmz tanmda value parametresi Kitap veri tipinde. Bylece daha en batan, koleksiyona veri tipi Kitap olmayan nesnelerin eklenmesini

engellemi oluyoruz. Uygulayacamz bir sonraki metod IList arayznnContains metodu: public bool Contains(Kitap value) { return (List.Contains(value)); } KitapKoleksiyonu.Contains Contains metodu value parametresinde belirtilen bir kitap nesnesinin koleksiyon iinde bulunup bulunmadn bildiriyor. Anlald gibi, eer parametrede belirtilen kitap nesnesi eer daha nce Add metodu ile koleksiyona eklenmise metod True dndryor. Burada da List zelliinden faydalandk. CollectionBase.List gerekli olan ilemleri bizim iin yine hallediyor. Bir sonraki metod IList.IndexOf metodu: public int IndexOf(Kitap value) { return (List.IndexOf(value)); } KitapKoleksiyonu.IndexOf ArrayList zerinde ska kullandmz bu metod, parametrede geilen nesnenin koleksiyon ierisindeki srasn (indeksini), eer belirtilen nesne koleksiyonda yoksa -1 dndryor. public void Insert(int index, Kitap value) { List.Insert(index, value); } KitapKoleksiyonu.Insert Koleksiyonumuzun Insert metodu, koleksiyon ierisine istediimiz bir pozisyona bir kitap nesnesi eklememizi salyor. public void Remove(Kitap value) {

List.Remove(value); } KitapKoleksiyonu.Remove Remove metodu belirtilen bir kitap nesnesinin koleksiyondan atlmasn gerekletiriyor. Koleksiyonda sakladmz Kitap nesnelerine indeks numaras belirterek ulaabilmek iin koleksiyonumuzda indeksleyiciler tanmlamamz gerekiyor: public Kitap this[int index] { get { return ((Kitap) List[index]); } set { List[index] = value; } } KitapKoleksiyonu indeksleyici tanm Yukardaki indeksleyici tanm sayesinde, indeks belirtilerek koleksiyon ierisinde saklanan kitap nesnelerine ulamak mmkn hale geliyor. Yaptmz tek ey List ierisinden belirtilen indekse sahip nesneyi ekmek, onu Kitap nesnesine dntrmek ve geri dndrmek. Belirtilen indeksin limitler ierisinde olup olmadn kontrol etmemize ayrca gerek yok; nk List, bu kontrol zaten gerekletiriyor ve eer belirtilen indeks koleksiyon ierisindeki nesne saysndan fazla ise bir hata (exception) frlatlyor. Buraya kadar yaptmz herey standart bir koleksiyon ierisinde olan metodlar tanmlamaktan ibaretti. Bu metodlar olutururken srekli olarak List zelliinden faydalandk. List, arka planda yaplmas gereken hereyi bizim iin gerekletirdi. ArrayListten farkl olarak bizim koleksiyonumuz, listesine, sadece Kitap snfndan oluturulmu nesnelerin eklenmesine izin veriyor. Bunu da Add, Insert,Remove metodlarnda parametreleri Kitap veri tipinde tanmlayarak gerekletirdik. Madem koleksiyonumuz sadece Kitap nesnelerini saklayacak, yleyse Add, Contains, Insert metodlarnn isteimize gre zelletirdiimiz versiyonlarn tanmlayabiliriz. Ayrca kitap adna gre indeksleme yapabilir, IndexOf metodunu kitap ismine gre indeks numaras dndrecek hale getirebiliriz. Add metodundan balayalm:

public int Add(string KitapAdi, string Yazar, DateTime BasimTarihi) { return (List.Add(new Kitap(KitapAdi, Yazar, BasimTarihi))); } KitapKoleksiyonu.Add Add metodunun ar yklenmi (! overloaded) versiyonu, Kitap snfnn tanmna uygun parametreler alyor, yeni bir kitap nesnesi oluturuyor ve oluturduu kitap nesnesini koleksiyona ekliyor. ByleceAdd metodunun iki versiyonunu yazm olduk. Birincisi listeye eklemek iin parametre olarak bir kitap nesnesi kabul ediyor, dieri iseKitapAdi, Yazar ve BasimTarihi parametrelerini kullanarak kitap nesnesini kendisi oluturup listeye ekliyor. Ayn ilemi Insert metodunda da kullanabiliriz: public void Insert(int index, string KitapAdi, string Yazar, DateTime BasimTarihi) { List.Insert(index, new Kitap(KitapAdi, Yazar, BasimTarihi)); } KitapKoleksiyonu.Insert Insert metodu da Add ile ayn ekilde, ald parametrelere gre yeni bir kitap nesnesi oluturuyor ve koleksiyona ekliyor. Contains, IndexOf ve Remove metodlarn kitap adna gre alan indeksleyicimizi yazdktan sonra uygulayacaz. nce indeksleyicimizi tanmlayalm: public Kitap this[string kitapAdi] { get { foreach (Kitap kitap in List) { if (kitap.KitapAdi == kitapAdi) return kitap; } return ((Kitap) null); } set { Kitap kitap = this[kitapAdi]; if (kitap != null)

List[IndexOf(kitap)] = value; } } Kitap adna gre alan indeksleyici Indeksleyicimiz kitap adna gre altndanget metodu koleksiyon ierisinde foreach ile bir tarama gerekletiriyor. Eer koleksiyon ierisinde belirtilen isimde bir kitap bulursa, bulduu kitap nesnesini dndryor. Eer kitapAdi parametresi ile geilen isimde bir kitap bulunamazsa, indeksleyici null dndryor. Bu arada unu da eklemekte fayda var; Koleksiyon ierisinde eer ayn isimde birka kitap varsa, indeksleyici sadece ilk rastlad kitab dndryor. Indeksleyicinin set metodu,get metodundan faydalanyor. Set metodu nce kitapAd parametresindeki isme sahip kitab kapal bir ekilde get eriim metodu ile ekiyor. ekilen kitap nesnesi null deilse, arka plandaki List nesnesine ulaarak, get ile bulunan kitab value parametresi ile gelen kitapla deitiriyor. ndeksleyiciyi oluturduumuza gre Contains, IndexOf ve Remove metodlarn indeksleyiciyi kullanarak uygulayabiliriz. nceContains metodu: public bool Contains(string KitapAdi) { return (this[KitapAdi] != null); } KitapKoleksiyonu.Contains Contains metodu isme gre alan indeksleyiciden faydalanyor. Indeksleyiciyi kullanarak, belirtilen isimde bir kitap bulunamaz ise false dndryor. public int IndexOf(string KitapAdi) { return (List.IndexOf( this[KitapAdi])); } KitapKoleksiyonu.IndexOf IndexOf metodu da indeksleyiciyi kullanarak, nce belirtilen isme gre kitaba ulayor, daha sonra List zerindeIndexOf metodunu ararak kitabn indeksini dndryor.

public void Remove(string kitapAdi) { List.Remove(this[kitapAdi]); } KitapKoleksiyonu.Remove Remove metodu yine indeksleyici zerinde belirtilen isimdeki kitab buluyor ve List.Remove metodu ile kitab koleksiyondan siliyor.KitapKoleksiyonu zerinde bylece tm ilemleri tamamlam olduk. Koleksiyonumuz artk sadece Kitap nesneleri ile alan, ve hatta kitap ekleme ve silme ilemlerini sadece indeks numaralar zerinden deil, kitap isimlerine gre de yapabilen bir koleksiyon haline geldi. Koleksiyonumuza Kitap nesneleri dnda hibir nesnenin eklenemeyeceini sylemitik, bir istisna dnda;Kitap snfndan tretilmi snflarn rnekleri koleksiyona eklenebilir. rnein: public class YemekKitabi : Kitap { } Kitap snfndan tretilmi YemekKitabi sinifi eklinde tanmn yaptmz yeni snftan oluturulan nesneler koleksiyona eklenebilir. Eer bunu da engellemek istiyorsakCollectionBasein OnInsert ve OnSet metodlarnn zerine yazmamz gerekir. Bu iki metod koleksiyona bir nesne eklendiinde ve indeksleyici kullanlarak koleksiyondaki bir nesne bir bakas ile deitirildiinde arlr. Bu iki metodun zerinde yazarak, koleksiyona eklenen nesnenin veri tipini kontrol edebiliriz: protected override void OnInsert(int index, object value) { if (value.GetType() != Type.GetType("Koleksiyonlar.Kitap")) throw new ArgumentException("Listeye Kitap snfndan oluturulmu nesneler eklenebilir.", value"); } KitapKoleksiyonu.OnInsert OnInsert metodu ierisinde listeye eklenmek istenen nesnenin veri tipini kontrol ediyoruz. Eer veri tipiKoleksiyonlar.Kitap veri tipinden farkl ise bir ArgumentException frlatyoruz. ByleceInsert metodunun arlmasnn nne gemi ve nesnenin koleksiyona eklenmesini engellemi oluyoruz. Ayn ilemi OnSet metodu iin tekrar edeceiz: protected override void OnSet(int index, object oldValue, object newValue) {

if (newValue.GetType() != Type.GetType("Koleksiyonlar.Kitap")) throw new ArgumentException("Listeye Kitap snfndan oluturulmu nesneler eklenebilir.", newValue"); } KitapKoleksiyonu.OnSet Bylece koleksiyona Kitap nesnelerinden baka nesnelerin eklenmesini imkansz hale getirmi olduk. Koleksiyonumuz kullanlmaya hazr...Kodlar toparlarsak; KitapKoleksiyonu.cs using System; using System.Collections; namespace Koleksiyonlar { public class KitapKoleksiyonu : CollectionBase { public Kitap this[int index] { get { return ((Kitap) List[index]); } set { List[index] = value; } } public Kitap this[string kitapAdi] { get { foreach (Kitap kitap in List) { if (kitap.KitapAdi == kitapAdi) return kitap; } return ((Kitap) null); }

set { Kitap kitap = this[kitapAdi]; if (kitap != null) List[IndexOf(kitap)] = value; } } public int Add(Kitap value) { return (List.Add(value)); } public int Add(string KitapAdi, string Yazar, DateTime BasimTarihi) { return (List.Add(new Kitap(KitapAdi, Yazar, BasimTarihi))); } public bool Contains(Kitap value) { return (List.Contains(value)); } public bool Contains(string KitapAdi) { return (this[KitapAdi] != null); } public int IndexOf(Kitap value) { return (List.IndexOf(value)); } public int IndexOf(string KitapAdi) { return (List.IndexOf(this[KitapAdi])); } public void Insert(int index, Kitap value) { List.Insert(index, value); } public void Insert(int index, string KitapAdi, string Yazar, DateTime BasimTarihi) { List.Insert(index, new Kitap(KitapAdi, Yazar, BasimTarihi));

} public void Remove(Kitap value) { List.Remove(value); } public void Remove(string kitapAdi) { List.Remove(this[kitapAdi]); } protected override void OnInsert(int index, object value) { if (value.GetType() != Type.GetType("Koleksiyonlar.Kitap")) throw new ArgumentException("Listeye sadece Kitap nesneleri eklenebilir.", "value"); } protected override void OnSet(int index, object oldValue, object newValue) { if (newValue.GetType() != Type.GetType("Koleksiyonlar.Kitap")) throw new ArgumentException("Listeye sadece Kitap nesneleri eklenebilir.", "newValue"); } } }

Kitap.cs using System; namespace Koleksiyonlar { public class Kitap { public Kitap() {} public string KitapAdi; public string Yazar; public DateTime BasimTarihi; public Kitap(string KitapAdi, string Yazar, DateTime BasimTarihi) {

this.KitapAdi = KitapAdi; this.Yazar = Yazar; this.BasimTarihi = BasimTarihi; } } }

KoleksiyonTest.cs using System; namespace Koleksiyonlar { public class KoleksiyonTest { public KoleksiyonTest() {} [STAThread] public static void Main() { // Tanmladmz koleksiyondan bir nesne oluturuyoruz... KitapKoleksiyonu koleksiyon = new KitapKoleksiyonu(); // Koleksiyona kitap nesneleri ekliyoruz... Kitap kitap1 = new Kitap("Kitap 1", "Yazar 1", new DateTime(1970, 1, 1)); koleksiyon.Add(kitap1); koleksiyon.Add("Kitap 2", "Yazar 2", DateTime.Now); Console.WriteLine("Koleksiyondaki kitaplar:"); foreach (Kitap kitap in koleksiyon) { Console.WriteLine("Kitap Ad:{0}\nYazar:{1}", kitap.KitapAdi, kitap.Yazar); } // Indeksleyici kullanarak kitap nesnesine ulayoruz... Console.WriteLine("Indeksleyici ile eriim."); Console.WriteLine(koleksiyon[0].KitapAdi);

// Kitaba indeksleyici ile kitabn ismini kullanarak ulayoruz... Console.WriteLine(koleksiyon["Kitap 2"].Yazar); // Kitaplardan birini siliyoruz... koleksiyon.Remove("Kitap 2"); Console.WriteLine(koleksiyon.Count); } } }

You might also like