class etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
class etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
30 Kasım 2011 Çarşamba 8 yorum

IEnumerable Nedir

Visual Studio içerisinde bir takım yaralı interfaceler(ara yüzler) yer almakta. Bunlardan bir tanesi de IEnumerable ara yüzü.

IEnumerable, çalışma mantığını pek merak etmediğimiz, fakat sıklıkla kullandığımız “foreach” döngüsünü kullanmamıza sağlamakta.

Array, List, ArrayList, Hashtable vb. birçok koleksiyon IEnumerable sınıfını implement etmiştir. Bu sayede, foreach döngüsünü kullanarak bu koleksiyondaki elemanlara ulaşabilmekteyiz.

Bu ara yüzü biraz daha iyi tanımak için foreach yapısını incelemek gerekiyor. Foreach döngüsünün arka planında while döngüsü yatmakta. Yani run-time anında foreach yapısı while döngüsüne dönmekte. Döngünün ilerleyip; dizideki diğer elemanlara erişebilmesi içinde IEnumerable dan “GetEnumerator” metodu ile IEnumerator sınıfını talep etmekte.

IEnumerator ara yüzü 3 adet metot içermekte, bunlar: MoveNext, Current ve Reset metotlarıdır.

MoveNext metodu; dizideki bir sonraki elemana erişmemize sağlar.

Current metodu; dizinin o anki indeksindeki değeri getirir.

Reset metodu; dizinin indeksini -1’e çeker.

Bu yapıya örnek vermek gerekirse;

Yukarıdaki kodda dizi elemanlarını listbox’a atılmıştır. Foreach döngüsü çalışma anında hemen altındaki while döngüsüne dönüşmüştür.

Konuyu biraz anlamamız için kendi sınıfımızı yaratıp, foreach döngüsünü kullanmaya çalışalım. Ben “Liste” adlı bir sınıf oluşturdum ve bu sınıftan instance alıp foreach yapısında kullanmaya çalıştım.

Kodu derlediğimde Visual Studio hata verdi. Sebebi ise Liste sınıfının “GetEnumerator” metoduna sahip olmaması. YANİ LISTE SINIFININ FOREACH YAPISINI DESTEKLEMEDİĞİ HATASI.

Desteklemesi için sınıfımızın IEnumerable sınıfından türemesi gerekmete.

IEnumerable ara yüzü, “System.Collections” referansında yer almakta. Ara yüzü sınıfımıza iplement ettikten sonra otomatik olarak Studio; IEnumerator tipinde “GetEnumerator” metodunu oluşturmakta.

Foreach yapısı,bizden dizimizin ilerleyip diğer elemanlara ulaşmamız içinIEnumerable’dan IEnumerator sınıfından türemiş bir sınıf istemekte. Ben bunun için “Gezici” adlı bir sınıf yaratıp, IEnumerator ara yüzünü implement ettim.

İmplement ettikten sonra, Visual Studio otomatik olarak 3 tane metot oluşturdu. Bunlar MoveNext, Current ve Reset metotları.

3 metodu yukarıdaki gibi değiştirdikten sonra, Form_Load eventinde aşağıdaki kodları uyguluyoruz:

Uygulamayı çalıştırdığımızda;

Görüldüğü gibi uygulamamızda hata almadık, Sınıfımızı IEnumerable sınıfından türettik ve IEnumerator sınıfı ile de döngümüz de ilerleyip verileri gösterdik.

Umarım faydalı bir yazı olmuştur.
29 Ekim 2011 Cumartesi 0 yorum

Nesne Yönelimli Programlamaya Giriş

Önceki makalemde neden Nesne Yönelimli Programlamaya ihtiyaç duyduğunu örnekle göstermeye çalışmıştım. Şimdi ise basit bir örnekle bu konuya giriş yapmak istiyorum.

Geçen hafta; Habertürk gazetesi Panini’nin şampiyonlar ligi yapıştırma albümünü vermişti. Bilmeyenler için söyleyeyim, albüm o sene şampiyonlar ligine katılmış futbol takımlarının oyuncularını içermekte. Bu albümde yazacağım konuma ilham kaynağı oldu. Yapacağım örnekte futbolcuların bilgilerini içeren bir yapı olacak.

Projeye başlamadan önce, size bir takım bilgiler paylaşmak istiyorum.

Class’lar ve Objeler:

Class’lar(Sınıflar) objelerin şekillendiği alanlardır. .Net Framework’te ve Java’da her şey obje den(object) meydana gelmiştir.

Yukarıdaki resimde türler arasındaki hiyerarşiyi görmektesiniz. Görüldüğü gibi “Object” tipi; türlerin atası yani en büyüğü. Buna bir örnek vermek gerekirse:

Sınıflar kendisine has özel tiplerdir. Örneğin “Random” sınıfı, örneğin Control grubundaki “Label” sınıfı.

“Random” sınıfı ile rastgele sayı üretebilirken, “Textbox” sınıfı ile Textbox oluşturup, bir değer girebiliyoruz.

Şimdi ise bir class’a nasıl bağlanılacağını görelim. Örneğin rastgele bir sayı üretelim, bunun için .Net Framework’te “Random” sınıfını kullanırız. Peki, “Random” sınıfına nasıl bağlanırız? Cevap “new” anahtarı ile.

Random rnd = new Random();” ifadesinde “new Random();” kelimesiyle; bellek ’de(RAM) yer açıp, “Random” sınıfına ait metot ve özelliklere(properties) belleğe yerleştirip, ulaşabiliriz. Örnek:

Yukarıdaki resimde görüldüğü bir hata alıyoruz, bunun sebebi; Random sınıfına ait özellikleri belleğe yüklenmemesinden kaynaklanan bir sıkıntı. Çözüm ise; "new" kelimesiyle bellek ’de yer açmak.

“new Random();” diyerek “Random” sınıfına ait bilgileri belleğe yükledik. Peki, Random sınıfındaki bilgilere nasıl ulaşacağız?

Class’lara(Sınıflara) Ulaşmak

Bir sınıfın bilgilerine ulaşmak için nesne(obje) oluştururuz. Oluşturduğumuz nesnenin hangi sınıfa ait olduğunu belirtmek içinde, oluşturduğumuz nesnenin başına Sınıf’ın ismini yazarız.

Random rnd;

Yukarıdaki kod parçacığı; Random sınıfına ait, rnd adlı bir nesneyi temsil etmekte.

Random rnd=new Random();

Yukarıdaki kod parçacığı ise, bellek ’de oluşturulan Random sınıfına, rnd adlı nesneyle ulaşılacağını göstermekte.

Bu bilgileri gösterdikten sonra, artık kendi sınıfımızı oluşturabiliriz.

Futbol Class’ı

Visual Studio da bir Windows Form projesi açıp, projeye “Futbolcu” adlı bir class dosyası ekleyelim.(Proje -> sağ_click -> Add -> Class) Ve Class’a aşağıdaki bilgileri girelim.

Yukarıdaki Sınıfta tanımlanmış tüm değerler birer field’tır(Alan). Ve bu alanlara objelerle ulaşırız. Fakat bir şartla!

Yukarıdaki kod parçacığını Form1_Load kısmına yazdığımızda, oyuncu adlı obje Futbolcu adlı sınıfın alanlarına ulaşamamaktayız. Bunun sebebi ise “Access Modifiers’dır(Erişim Düzenleyicileri)”.

Neden Access Modifiers(Erişim Düzenleyicileri) Kullanılır

Bir sınıfın içerisinde alanlar ve metotlar yer alabilir. Fakat bazı alanlara veya metotlara ulaşılmasını istemeyiz. Bunun sebebi ise, o alanların veya metotların sınıfın içerisinde kendisine has hesaplamalarda kullanılacağındandır. Eğer biz o alanlara istediğimiz her şekilde ulaşsaydık, o alanlara yanlış değerler yükleyip, hesaplamaların veya kodun doğru çalışmasını engellerdik.

Yukarıdaki Futbolcu sınıfının içindeki tüm alanlar “private”(gizli) erişim belirleyicisine sahiptir. Bunu değiştirmek içinde tüm alanların başına “public” kelimesini yazarız.

Bu şekilde tüm alanlar ulaşılabilir oldu. Tekrar Form1_Load kısmına döndüğümüzde;

Artık Futbolcu sınıfına ait tüm alanlara ulaşabiliyoruz. Şimdi ise bu alanlara gerekli bilgileri girelim.

Form’a bir tane ComboBox attım ve ismini “cmbFubolcular” olarak değiştirdim ve oyuncu isimlerini ComboBox’a ekledim. Yarattığım oyuncu nesnelerini de, global olarak “lst” adlı bir Futbolcu List’i yaratıp, List’e ekledim. Amacım ComboBox’dan seçtiğim bir futbolcunun bilgilerini formda göstermek. Bunun için ComboBox’ın “SelectedIndexChange” eventini yakaladım ve seçilen futbolcunun index’ine göre List’de bulup Form da gösterdim.

Bu da Formun tasarımı:

Bu da Çalışır hali:

(Not: Yukarıdaki resimde Futbolcular-Futbolcu Ekle-Güncelle adlı sekmeler görmektesiniz. Ben işin biraz gırgırı olsun diye yaptım, sizlere burada gösterip konuyu dağıtmak istemiyorum)

Şimdi ise sınıflarda metot kullanımını gösterelim. Yukarıdaki resimde görüldüğü gibi futbolcunun maç başı istatistikleri gözükmemekte, şimdi ise bu istatistiki bilgileri hesaplayalım. Futbolcu sınıfımıza aşağıdaki metotları ekleyelim ve gerekli değişiklikleri yapalım.

Metot tanımlamada 2 noktayı dikkat çekmek istiyorum. Birincisi; kullanılacak her metodun başında bir erişim düzenleyicisi var. Eğer herhangi bir erişim düzenleyicisini belirtmezseniz, o metot “private” olarak tanımlanır. İkincisi ise; bir metot içerisinden sınıfın alanlarına, erişim düzenleyicisi her ne olursa olsun rahatça erişe bilinmesi.

(Not: ToString() içerisindeki “N” ifadesi virgülden sonra 2 basamak gösterileceğini belirtmekte.)

Bu yazdığımız metotları aşağıdaki şekilde ulaşabiliriz:

Kodun Ekran Görüntüsü:

Umarım yararlı bir makale olmuştur. Diğer makalede görüşmek dileğiyle.
 
;