14 Mart 2010 Pazar

Object Oriented Programming (8) - Field, Property, Method, Event :

Field, Property, Method, Event :


Field : Class içerisinde tanımlanan ve değer saklamak amacıyla kullanılan Class öğeleridir. private modifier'ı (erişim denetleyicileri) ile tanımlandığı için, bu öğelere class dışından erişilemez.

Aşağıda ki örnekte Ad değeri saklamak için string türünde bir field tanımladım.

private string _ad;

Property : Field içerisindeki değerleri, okumak, yazmak veya değiştirmek amacıyla kullanılan Class öğeleridir. public modifier'ı ile tanımlandığı için, bu öğelere Class tanımlandığı zaman(Class'dan Object türetildiği zaman) erişilebilir. Property'nin asıl amacı Class içerisinde data depoladığımız Field değerini değiştirmektir.

Bir Property Get ve Set adında iki accessor'dan oluşur. Get accessor Field içerisindeki değeri okumak için, Set accessor ise Field değerini değiştirmek için kullanılır. Property içerisinde Get ve Set accessor'ları kullanarak property'nin tipini belirleriz. Eğer Property içerisinde hem Get hem de Set accessor'u kullanıyorsak propery'miz standart(hem değer yazılabilen hemde okunabilen) bir property olur. Sadece Get accessor'u kullanılıyorsak okunabilir, Set accessor'u kullanıyorsak sadece yazılabilir bir property olur.

Aşağıdaki örnekte _ad field'ı içerisindeki değeri okuyabilen ve değiştirebilen Ad isimli string bir property tanımladım.

public string Ad
{
get
{
return _ad;
}


set
{
_ad = value;
}
}


Aşağıdaki örnekte sadece okunabilir bir property tanımladım. Bu tür property'ler genellikle dışarıdan değiştirmesini istemediğimiz program tarafından otomatik olarak üretilen değerler için kullanılır.


//_sayi field'ın değeri herhangi bir metod içerisinden alınabilir.


private int _sayi = 20;

public int KayitSayisi
{

get
{
return _sayi;
}

}

Son olarak bir yazılabilir property örneği verelim. Bu tür property'lerde field'ın değeri sadece değiştirilebilir.

//_sayi field'ın değeri herhangi bir metod içerisinden alınabilir.


private int _sayi;

public int Uzunluk
{


set
{
_sayi = value;
}

}

Method : Method'lar, Object ve Class'a ait eylemleri(aksiyonları) gerçekleştirebildiğimiz kod bloklardır. Örneğin bir Sifre class'ında, Sifre üretme veya var olan şifreyi sıfırlama işlemleri method olarak sayılabilir(yazılabilir). 2 çeşit method tipi vardır. Bunlar ;

• Geriye değer döndürmeyen method(void) : Bu tür method'lar sadece içerisindeki kod bloğunu çalıştırır.

Aşağıdaki örnekte string değer alan, aldığı bu değeri MessageBox üzerinde gösteren ve geriye değer döndürmeyen bir method tanımı yapılmıştır.

public void MesajGoster(string mesaj)
{
MessageBox.Show(mesaj);
}


• Geriye değer döndüren method(function) : Bu tür method'lar da tıpkı void gibi içerisindeki kod bloğunu çalıştırırlar. Fakat void'lerden farklı olarak geriye bir değer(return deyimi ile) döndürürler. Bu değer reference type veya value type türünden olabilir.

Aşağıdaki örnekte, geriye 10 karakter uzunluğunda string değer döndüren, bir method tanımı yapılmıştır. Bu method ile karakterleri harf ve rakamdan oluşan rastgele şifreler üretilmektedir.

public string SifreUret()
{
char[] karakter = {'A','B','C','D','E','F','G','H','I', 'J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z', '1','2','3','4','5','6','7','8','9','0','a','b','c','d','e','f','g', 'h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x', 'y','z'};

Random rnd = new Random();
int RastgeleSayi;
string sonuc = null;
for (int i = 1; i <= 10; i++)
{
RastgeleSayi = rnd.Next(0, karakter.Length - 1);
sonuc += karakter[RastgeleSayi].ToString();
}


return sonuc;


}

Method içersisindeki işlemleri gerçekleştirirken field değerlerinden faydalanabiliriz. Örneğin yukardaki method da kullandığımız 10 karakterlik sabit şifre uzunluğunu, Uzunluk adında bir property'den alarak değişken hale getirebiliriz. Böylece SifreUret methodumuz, girilen şifre uzunluğuna göre otomatik olarak şifre üretir.

Aşağıdaki örnekte Uzunluk propertisinin ve SifreUret methodunun beraber kullanımı gösterilmektedir.

//Field = Class içerisinde değer saklamak için kullanılır


private int _uzunluk;

//Property


public int Uzunluk
{
get { return _uzunluk; }
set { _uzunluk = value; }
}


public string SifreUret()
{
char[] karakter = { 'A','B','C','D','E','F','G','H','I',
'J','K','L','M','N','O','P','Q','R',
'S','T','U','V','W','X','Y','Z',
'1','2','3','4','5','6','7','8','9','0',
'a','b','c','d','e','f','g','h','i','j','k',
'l','m','n','o','p','q','r','s','t','u','v',
'w','x','y','z','!','@','?','$'};


Random rnd = new Random();
string sonuc = null;

for (int i = 1; i <= _uzunluk; i++)
{
int rastgeleSayi = 0;
rastgeleSayi = rnd.Next(0, karakter.Length - 1);
sonuc += karakter[rastgeleSayi].ToString();
}


return sonuc;
}

Metot Overload

Metot Overload (metodları aşırı yükleme), bir metodun birden fazla, farklı imza ile tanımlanmasıdır. Daha farklı bir anlatımla aynı isimli metodun birden fazla farklı parametre imzası almasıdır.

Güncel hayattan bir örnek ile konuyu açalım. Biri size “Benim doğum tarihim 6.5.1980. Ben kaç yaşındayım?” diye sorabilir. Aynı soru “Benim doğum yılım 1980. Ben kaç yaşındayım?” olarak da sorulabilir. Aslında burada iki farklı hesaplama söz konusudur. Birincisinde günümüzdeki yıldan verilen değerdeki yıl bulunarak çıkartılır. İkincisinde ise günümüzdeki yıldan direk verilen değer çıkartırılır. Bu iki farklı hesaplama dolayısı ile iki farklı metot gerektirir. Bu metotları kod olarak yazmak istersek şu şekilde yazabiliriz:

int TariheGoreYasHesapla(DateTime tarih)
{
int sonuc;
int dogumYili=tarih.Year;
sonuc = DateTime.Now.Year - dogumYili;
return sonuc;
}


int YilaGoreYasHesapla(int yil)
{
int sonuc;
sonuc = DateTime.Now.Year - yil;
return sonuc;
}

Ancak görüldüğü gibi bu iki metotun da amacı aynıdır: Yaş Hesaplamak! C#, parametrelerin imzası ayrı olduğu sürece birden fazla metota aynı ismi verme olanağını tanır.

Bu bilgi ışığında kodlar şu şekilde yazılabilir:

int YasHesapla(DateTime tarih)
{
int sonuc;
int dogumYili=tarih.Year;
sonuc = DateTime.Now.Year - dogumYili;
return sonuc;
}


int YasHesapla(int yil)
{
int sonuc;
sonuc = DateTime.Now.Year - yil;
return sonuc;
}

Artık sadece YasHesapla ismi kullanılarak iki metot da çağırılabilir. Eğer metoda DateTime tipinde bir değer gönderirseniz ilk metot, int veri tipinde değer gönderirseniz ikinci metot çalışacaktır. Visual Studio’da bir metotun kaç overload’u olduğu görülebilir. Ayrıca bu metotun overload’larının istediği imzalar IntelliSense’de aşağı-yukarı ok tuşları ile gezilebilir.










Overload’ların kullanılma nedeni yazılımcıyı metot kargaşasından kurtarmaktır. Aşağıdaki şekilde görüldüğü gibi MessageBox sınıfının Show metodunun 21 tane overload’ı vardır.

MessageBox’ın kullanımını hatırlayın. Bazen sadece ekranda mesaj olarak gözükmesi gereken metni verirken, bazen metnin yanında pencere başlığını, bazen pencerede gözükecek ikonu, bazen de Yes-No, OK gibi gösterilecek düğmeleri veriyoruz. Aslında bunların hepsi ayrı ayrı metotlardır. Eğer MessageBox’ın Show metotlarında overload kullanılmasaydı .

MessageBox.SadeceMetinGoster(“Merhaba Dünya”);
MessageBox.MetinVeBaslikGoster(“Merhaba Dünya”,”İlk Programım”);
MessageBox.MetinBaslikVeDugmeGoster(“Merhaba Dünya”,”İlk Programım”, Buttons.YesNo);

gibi kargaşaya yol açan bir çok metot kullanılacaktı. Oysa overload sayesinde sadece Show metodunu kullanıp parametrelerini değiştiriyoruz.

Hiç yorum yok: