26 Haziran 2010 Cumartesi

C#'da Ozel Interfaceler(IComparable, IComparer, IDisposable, ICloneable))

C#da kullandigimiz metotlarin,property'lerin vs. arka planda nasil bir gorev yaptiklariyla pek ilgilenmeyiz genelde.sayi.ToString() der geceriz. Yada daha onceki makalelerde de oldugu gibi foreach(int a in dizi) diyip elemanlari yazariz direk. Fakat C#'da tum gorevler icin framework'de aslinda oldukca onemli atamalar, metot cagirimlari vs. yapiliyor aslinda. Simdi bunlarin en onemlilerini kisaca yazmaya calisacagim.

IComparable: Bizim nesnelerimizi karsilastirmamizi saglayan koddur. int a=5 ile int b=6'yi karsilastirmak kolay fakat biz kendi yazdigimiz Urun sinifini karsilastirmak istersek ne yapacagiz. Kisaca yapmamiz gereken Urun classini IComparable'dan implement edip,

class Urun:IComparable

IComparable'ye ait CompareTo metodunu kendi algoritmamiza uyarlamak.

public int CompareTo(object obj) //ArraySort metodu ile geldi buraya
{
Urun gelen = (Urun)obj;
//Gelen nesneleri Fiyat ozelliklerine bakarak siraladik..
if (Fiyat > gelen.Fiyat) return 1;
else if (Fiyat <>
else return 0;
}

Bizim Urun nesnemiz su sekilde olsun diyelim ki;
Urun[] urunler = { new Urun(1, "Monitor", 200), new Urun(2, "Klavye", 80), new Urun(3, "Mouse", 100) };
Buna gore eger biz
Array.Sort(urunler);
dersek, bizim Urun sinifinda yazdigimiz ve IComparable interfacesini implement ettigimiz icin olusturdugumuz CompareTo() metodu cagrilacak ve karsilastirmalar sonucunda 1,-1 ve 0 degerini dondurecek.Kisaca yaptiklarimizi maddeler halinde yazmak istersek;

  • Sort metodu, gelen dizinin icinden belli bir siralama algoritmasi kullanarak, her defasinda iki elemani secer!
  • Bu iki elemani CompareTo metodundan gelen sonuca bakarak karsilastirir ve gelen sonuca gore elemanlari siralanmasini saglar.
  • Sort metodunun calisabilmesi icin gelen dizideki tum elemanlarin karsilatirilabilir tipler olmasi gerekmektedir.Yani Icomparable interface'ini implement etmesi gerekir.
Array.Sort(urunler); sonucunda da urunler dizisini nasil karsilastirma yapacagini bilmedigi icin biz compareto metodunu implement ettik ve biz aslinda yeni bir metot yazdik. buna gore bizim sectigimiz uzere fiyatlara gore karsilastirma yapacagiz artik.

IComparer: IComparable olmayan ve buna izin verilmeyen classlar icin uygulanir. Ornegin SqlConnection sinifini hic bir sekilde karsilastirma yapamayiz. Ama bu metot sonucunda bunu yapabilir duruma gelecegiz.

class SqlConnectionComparer:IComparer

IComparer'i implement ettigimiz icin Compare metodunu tekrar icini doldurmamiz gerekecek;

public int Compare(object x, object y)
{
//gelen connectionlarin ConnectionStringlerine bakalim ve alfabetik siraya koyalim.
SqlConnection c1 = (SqlConnection)x;
SqlConnection c2 = (SqlConnection)y;
return c1.ConnectionString.CompareTo(c2.ConnectionString);
}

ConectionString bize string bir deger dondurdugu icin ve stringleri de biz karsilastirma yapabildigimiz icin, ayni zamanda da string IComparable oldugundan CompareTo metodu oldugunu biliyoruz. Onu cagirirsak karsilastirmayi yapabilmis oluruz..
SqlConnection nesnemiz de su degerlerden olussun;
SqlConnection[] baglantilar =
{
new SqlConnection("InitialCatalog=AdventureWorks"),
new SqlConnection("Server=localhost"),
new SqlConnection("server=."),
new SqlConnection(""),
};
Array.Sort(baglantilar, new SqlConnectionComparer());
IDisposable: Bu interfacemiz de kisaca, GarbageCollector'dan fazladan duran nesneler silinirken yapmasini istedigimiz islemi belirtiriz. Ornegin; programi kapatmak istedigimiz zaman yaptigimiz islemleri kaydetmek isteyip istemedigimizi sormasi gibi programin. Bu interface de yine ayni sekilde Dispose metodunu bize icini doldurmaya mecbur kilar. Bu interfaceyi kullanmak istiyorsak yazmis oldugumuz class'i IDisposable'a implement edip Dispose() metodunun icini doldurmamiz gerekir.

ICloneable: Isminden de anlasilacagi uzere bir nesneyi klonlamak istersek, yani ayni nesneyi farkli adreste tutmak istersek kullanmamiz gereken interface'dir. Clone() metodunu getirir bu interface de.

3 yorum:

mehtap dedi ki...

Acıklayıcı bir anlatım olmuş teşekkürler.

Ergin Arslan dedi ki...

tesekkur ederim. :)

Adsız dedi ki...

eğer ürün isimlerini fiyata göre sıralamak ve bu sıralı ürün isimlerini(sadece monitörleri, diğer özellikler olmayacak) bir diziye atmak istesek nasıl olacaktı?

yani

[monitör, klaveye, vb..]

yukarıdaki dizi fiyata göre sıralı olacak