BİL107U
Ünite 6: Nesneye Yönelik Programlamaya Giriş
PROGRAMLAMA I
Giriş Modern Nesne Yönelimli Programlama ya da Nesne Tabanlı Programlama yönteminde, her şey sınıf ve nesnelerin birbiri ile ilişkisi üzerine kuruludur. Nesneye yönelik programlamada kullanılan sınıf ve nesneler, gerçek hayatın bir uyarlaması olduğu için anlaşılması ve uygulanması daha kolaydır. Ayrıca program geliştiricilere de birçok avantaj ve kolaylık sağlamaktadır. Büyük yazılım projelerinin çok sayıda yazılımcı ile küçük parçalara ayrılarak daha kolay yazılması, bir kere yazılan bir kodun ihtiyaç halinde başka yerlerde de kullanılabilmesi bu avantajlara örnek gösterilebilir. Nesne tabanlı programlamanın asıl amacı, her şeyi en küçük parçasına kadar parçalamak, bu parçaları bir araya getirerek bütünü oluşturmak ve tüm bu parçaları tekrar tekrar kullanmaktır. Sınıf (Class) Kavramı Sınıflar da modüler yapının önemli bir parçasıdır hatta temel yapı taşıdır. Sınıflar soyut kavramlardır fakat somut olan nesnelerin oluşturulması için kullanılır. Sınıflar birer veri türüdür ve nesne oluşturabilmek için veri modeli sunar. Yani birer şablon yapıdır. Bu şablon içerisinde nesnelerin özellikleri, üyeleri ve davranışları tanımlanır. Kendinden oluşturulan bir nesnenin, bu sınıfa ait tüm özellikleri ve fonksiyonları taşıması beklenmektedir. Nesne içerisinde tüm bu verileri tutabileceğimiz değişkenler ile nesnenin davranış ve kabiliyetlerinin tanımlandığı fonksiyonlar yer almaktadır. Sınıf Bildirimi Sınıfların nesne üretmek için hazırlanmış şablon yapılar olduğundan hareketle nesnelerin davranışlarını, özelliklerini ve bunların başlangıç durumlarını tanımlamak için kullanılırlar. Bir sınıfı tanımlamak için “class” anahtar kelimesi ve sınıfımıza vermek istediğimiz ismi belirtiriz. Örneğimizdeki sınıfın ismini “Personel” olarak tanımladığımızı düşünelim. Böylece boş bir sınıf oluşturulur. Bu sınıfın işe yarayabilmesi için sınıfımızda kullanacağımız değişkenleri ekleyerek devam edelim. class Personel { string isim ; string soyisim ; int dogumYili; string cinsiyet ; string meslek ; string ehliyet = "B" ; } Burada dikkat edilmesi gereken nokta, “Personel” sınıfının bir şablon olmasıdır. Bu sınıfa eklediğimiz “isim” özelliğine bu aşamada herhangi bir değer ataması yapılamaz. Sadece ehliyet=”B” değişkeninde görüldüğü gibi ilk değer ataması yapılabilir. Yani bu sınıftan üretilen
her bir yeni nesnenin ehliyet değişkeni bu değeri alacaktır, ta ki nesnenin bu özelliği değiştirilene kadar. Bu değişkenlere değer atamaları ise, bu sınıftan oluşturulan nesneler üzerinden gerçekleştirilir. Struct (Yapı) C# programlama dilinde struct (yapı) ile class (sınıf) yapıları oldukça benzer yapılardır. Farkları, struct yapıları değer (value) tipinde, sınıf yapıları ise referans (reference) tipindedir. Hafızada tutuldukları yerler farklıdır. Bu yüzden sınıf tipinde oluşturulan bir nesne boş olabilir fakat struct tipinde oluşturulan nesne boş olamaz. Struct yapıları da değişken ve metot içerebilirler. Kullanımı şu şekildedir: struct yapi_ismi { yapi-elemanlari-listesi; } Struct ile sınıf arasındaki farklar şöyle sıralanabilir:
• Sınıflarda yapıcı metotlar varken, struct yapılarında sadece ilk değer ataması yapılan, parametreli yapıcı metoda izin verilmektedir.
• Struct, değer tipi olduğu için sınıflar gibi null olamaz.
• Sınıflar hem interface (arayüz) hem de başka sınıflardan kalıtıma izin verirken, struct yapısı sadece interface (arayüz) uygulayabilir, kalıtımı desteklemez.
• Struct elemanlarının default değerleri public tanımlıdır. Sınıf elemanlarının default değerleri ise private tanımlıdır.
• Bellekte büyük yer işgal etmeyen ve oluşturulan nesneler çok kullanılmayacak ise sınıf yerine struct kullanılabilir. Nesne Nesneler, sınıflarda tanımı yapılmış değişkenlere anlamlı bir şekilde değer atanabildiği ve sınıfın sahip olduğu metotları kullanabilen bir yapıdır. Daha açık bir ifade ile sınıf şablonunu kullanarak oluşturduğumuz somut yapıdır. Şablondan oluşan bu yapıya artık değer atamaları yapabiliriz. Personel sınıfımızdan bir nesne oluşturmak istediğimizde şu şablona uygun bir tanımlama yapmamız gerekmektedir: SınıfAdı değişkenAdı = new SınıfAdı() ; Personel personel = new Personel(); Personel sınıfından bir nesne oluşturduk. Nesne oluşturmak, bellekte Personel nesnesinin bütün öğelerinin sığacağı kadar bir yer ayrılması demektir. Yapılan işleme de “nesne oluşturmak” denir. Bundan sonra bu sınıfın tüm elemanlarına ve metotlarına ulaşabilmek için personel nesnesinden sonra “.” nokta koyarak işlemler gerçekleştirilebilir.
Nesne Başlatıcıları Sınıflara tanımlı değişkenlere veri atanması ve veriyi okuma sırasında bu işi yapacak bir metoda ihtiyaç duyulmaktadır. Bu işlemleri gerçekleştiren metotlar set/setter (değer atayan) ve get/getter (değer okuyan) metotlar olarak adlandırılmaktadır. Alan Kavramı Alan kavramı nesneye yönelik programlamanın temel ilkelerinden olan sarmalamayı uygularken kullanılır. Bu ilkeye göre, sınıf tanımlaması içindeki değer tutan değişkenlere doğrudan erişim engellenmelidir. Bu değişkenlere değer ataması için de özelliklerden faydalanılır. Bu değişkenlere değer atarken ya da değerlerini okurken tanımlanan bu özellikler kullanılabilir. Bu özelliklere ihtiyaca göre kontroller koyabilir ve güncelleyebiliriz. Sınıftan üretilmiş nesnelerin bu özelliklere doğrudan erişimleri vardır fakat alanlara erişimi yoktur ve olmamalıdır. Aksi durumda, bu alanların değerlerine istenmeyen değer atamaları yapılarak kodda hata oluşmasına neden olacaktır. İsim Alanı Türkçe karşılığını isim alanı olarak çevirebileceğimiz namespace kavramı, programlamada kütüphane kavramına karşılık gelmektedir. Programlamayı kolaylaştırmak için oluşturulan bu kavram, aynı amaca hizmet eden veya belirli başlıklar altında toplanabilen kodların gruplanmasıdır. Program yazarken ihtiyaca göre kullanılacak kütüphanenin projeye dâhil edilmesi ile desteklediği modülleri kodumuzda kullanabiliriz. Kullanımda ihtiyaç duyulmayan kodlar projeye dâhil edilmediği için, bu kütüphaneleri kullanmak, kodun derlenme süresinin daha kısa olmasını sağlarken, kodun büyümesini de engelleyecektir. Örneğin C# dilinde dosya ve klasör işlemleri yapmak için System.IO kütüphanesini, veritabanı işlemleri yapabilmek için de System.Data kütüphanesini projeye eklememiz gerekmektedir. Kütüphanelerin projeye dâhil edilmesi için sayfanın en başında “using” anahtar kelimesini kullanılır. Kütüphaneler sadece .Net kütüphaneleri olmak zorunda değildir. Farklı modüller için de geliştirilmiş harici kütüphaneleri veya kendi yazdığımız kütüphaneleri de farklı farklı projelerimizde kullanabiliriz. Yapıcı Metotlar Yapıcılar, nesne oluşturmak ve nesnenin varsayılan değerlerinin atanmasına imkân sağlamak için tasarlanmış özel metotlardır. Bir sınıfa ait yeni bir nesne (örnek) oluşturulmak istendiğinde, ilgili sınıfın yapıcı metodu çağrılarak nesnemiz bu metoda göre şekillendirilir. Yani nesnenin oluşturulabilmesi için ihtiyaç duyulan tüm düzenlemeler burada yapılır. Yapıcı metotlar parametre alan ve almayan şekilde dizayn edilebilir. Yapıcı metotlar, kendi sınıfları ile aynı isme sahiptirler ve herhangi bir geri dönüş değeri içermezler yani void de yazılmaz. Ayrıca yapıcı metotlar sınıf içerisinde tanımlanmadıysa bile bu sınıftan nesne oluşturulurken otomatik olarak çağırılırlar. Bu metotlara ayrıca kurucu metot da denmektedir.
Yapıcı metotlar hem parametreli hem de parametresiz olarak sınıfımızın içerisinde birden fazla tanımlanabilir. Bunun yanında tıpkı değişkenlerde olduğu gibi, aynı kod bloğu içinde birden fazla, aynı sınıftan nesne oluşturmaya da izin verilmektedir. Kopya Yapıcı Metotlar Kopya Yapıcı metotlar, değişkenleri başka bir nesneden kopyalayarak bir nesne oluşturan ya da bir nesnenin verilerini başka bir nesneye kopyalayan yapıcı metotlara verilen isimdir. Kopya yapıcı metodumuz aslında aynı sınıf tipinde bir parametre içeren parametreli bir yapıcıdır. Kopya yapıcı metodun kullanım amacı, mevcut bir nesnenin değerleri ile yeni bir nesne oluşturmaktır. C# programlama dili, nesneler için kopya yapıcı metot sağlamamaktadır; ancak programda bir kopya yapıcı metot hazırlanmak isteniyorsa, ihtiyaca göre oluşturulabilir. Yıkıcı Metotlar Yıkıcı metotlar, nesneye artık ihtiyacın olmadığı durumlarda çalışan metotlardır. Yıkıcı metotlar da tıpkı yapıcı metotlar gibi otomatik olarak çağrılırlar. Yapıcı metotlar nesne oluşturulurken çağrılır, yıkıcı metotlar ise nesne bellekten silinirken çağrılır. Yapıcı metotlara benzer şekilde yıkıcı metotların da isimleri sınıf ismi ile aynı olmak zorundadır; yalnız bir farkla: yıkıcı metot isminin başına tilda “~” işareti alır. Yıkıcı metotlar parametre alamaz ve geri değer döndüremezler. Parametre alamadıkları için de birden fazla tanımlanma şansı da yoktur. Yapıcı metotlara benzer şekilde, yıkıcı metotları da tanımlamak zorunda değiliz. Tanımlanmadığı zaman yıkıcı metot arka planda otomatik olarak çağrılmaktadır; dışarıdan çağrılamaz. Yıkıcı metotlar daha çok C++ gibi bellek yönetiminin programcı tarafından kontrol edildiği dillerde önem kazanmaktadır. C#, Java gibi yüksek seviyeli dillerde bellek (RAM) temizliği için arka planda çalışan servisler bulunmaktadır. Bu yüzden ihtiyaç olmadıkça yıkıcı metotlar kullanılmaz. This Anahtar Kelimesi C# programlama dilinde her şey sınıflar içerisinde tanımlanır. Kod içerisinde tanımlanmış değişkenler de sınıflar, metotlar ya da kod blokları içinde yer almaktadır. Global yani her yerden erişilebilen değişken ve fonksiyonlara izin verilmez. Bunun yerine “global” yetki verilmesi istenen sınıfın üyesi, “public” erişim denetleyicisi ile tanımlanır. Böylece “public” yani her yerden erişilebilen bir yetkiye sahip olan sınıfın üyesine başka sınıflardan da erişebiliriz. Sınıf içerisindeki metotlarda kimi zaman metot içindeki değişkenler, yani yerel değişkenler ile sınıf değişkenleri aynı isimde tanımlanmış olabilir. Böyle durumlarda, metotlar önceliği kendi yerel değişkenlerine verirler. Erişim Denetleyicileri (Access Modifiers) C# programlama dilinde de diğer nesne yönelimli dillerde olduğu gibi, tüm üyelerin bir erişim seviyesi vardır. Tüm
üyeler sınıflar içerisinde tanımlandığından, sınıflar ve bu sınıfa ait üyelere erişim kısıtlanabilir veya belirli düzeyde erişime izin verilebilir. Erişim denetleyicilerin amacı, sınıftaki üyelerin sınıf, metot ve özellik gibi diğer kod bloklarına nasıl erişeceğinin kurallarını belirlemektir. Erişim denetleyicilere, erişim belirleyicileri de denmektedir. C# programlama dilinde erişim belirleyici tanımlanması zorunlu değildir. Erişim denetleyicisi tanımlanmadığı durumlarda ön tanımlı erişim denetleyicisi olarak “private” verilmektedir. Böylece sadece tanımlı olduğu sınıf içerisinden erişim sağlanır. Erişim denetleyicileri şunlardır:
• Public Erişim Denetleyicisi
• Private erişim denetleyicisi
• Protected erişim denetleyicisi Genişletilebilir Metotlar (Extension) Metotlar Kelime manası genişletilebilir metot anlamına gelen Extension metotlar, .Net içerisinde bulunan sınıflara yeni metotlar eklenebilmesini sağlamaktadır. Sınıf yapılarını modifiye etmeden ilgili sınıf için “extension” metotlar eklememize imkân verir. Bu metotları yazarken uyulması gereken birkaç kural bulunmaktadır. Bunlar;
• Static bir sınıf içerisinde static olarak tanımlanmalıdır.
• Genişletilecek sınıf, ilgili extension metoduna önünde “this” anahtar kelimesi eklenerek metodun ilk parametresi olarak verilmelidir.
• Extension metodu birden fazla parametre alabilir, ama sadece bir parametre “this” anahtar kelimesi ile tanımlanabilir. Daha anlaşılır olması için konuyu bir örnek üzerinde inceleyelim. Örneğimizde integer bir değer alan metodumuz, bu sayının asal olup olmadığını bize döndürsün. public static class ExtensionClass { public static bool AsalMi(this int sayi) { int kontrol = 0 ; int i = 2; while (i < sayi) { if (sayi % i == 0) kontrol++; i++; } if (kontrol != 0) return false ; // sayı asal değil else return true ; // sayı asal; } }
class Program { static void Main(string[] args) { int rastgeleSayi = 7654321; if (rastgeleSayi.AsalMi() ) { Console.WriteLine("Girdiğiniz sayı asaldır."); } else { Console.WriteLine("Girdiğiniz sayı asal değildir."); } } } Örnekteki kodu incelediğimizde, public static bool AsalMi(this int sayi) metodumuz static olarak tanımlanmış ve bool türünde de geri değer döndürecektir. AsalMi metodumuz ise, “this” anahtar kelimesi ile tanımlanmış “int” sınıfını genişleterek, metot içinde kullanılması için “sayi” parametresi ile tanımlanmıştır. Genişletilmiş metodumuzu çağırdığımız Main metodunda ise, “int” türünden tanımlanmış rastgeleSayi değişkenimize bir değer ataması yapıldığını görüyoruz. Bu değişkene ait özelliklerden de nokta işaretinden sonra bizim eklediğimiz “AsalMi” metoduna erişim sağlıyoruz. Bu metodun döndürdüğü değeri de bir kontrol bloğu içinde sonucu yazdırmak için kullanıyoruz. Extension metodumuzu integer sınıfına yazdık ve bu metot sadece integer sınıfı için tanımlıdır ve bu kısmı diğer türler ile genişletmek de mümkündür. Peki, bir metodu bütün sınıflar için geçerli hale getirmek istersek ne yapmalıyız? Bunun için int ifadesi geçen yeri object yapmak yeterli olacaktır. Örneğimizde tüm sınıflar için SayiMi metodu hazırlanmıştır. Parametre ile gönderilen değer bir sayı ise True, değilse False değeri döndürmektedir.
her bir yeni nesnenin ehliyet değişkeni bu değeri alacaktır, ta ki nesnenin bu özelliği değiştirilene kadar. Bu değişkenlere değer atamaları ise, bu sınıftan oluşturulan nesneler üzerinden gerçekleştirilir. Struct (Yapı) C# programlama dilinde struct (yapı) ile class (sınıf) yapıları oldukça benzer yapılardır. Farkları, struct yapıları değer (value) tipinde, sınıf yapıları ise referans (reference) tipindedir. Hafızada tutuldukları yerler farklıdır. Bu yüzden sınıf tipinde oluşturulan bir nesne boş olabilir fakat struct tipinde oluşturulan nesne boş olamaz. Struct yapıları da değişken ve metot içerebilirler. Kullanımı şu şekildedir: struct yapi_ismi { yapi-elemanlari-listesi; } Struct ile sınıf arasındaki farklar şöyle sıralanabilir:
• Sınıflarda yapıcı metotlar varken, struct yapılarında sadece ilk değer ataması yapılan, parametreli yapıcı metoda izin verilmektedir.
• Struct, değer tipi olduğu için sınıflar gibi null olamaz.
• Sınıflar hem interface (arayüz) hem de başka sınıflardan kalıtıma izin verirken, struct yapısı sadece interface (arayüz) uygulayabilir, kalıtımı desteklemez.
• Struct elemanlarının default değerleri public tanımlıdır. Sınıf elemanlarının default değerleri ise private tanımlıdır.
• Bellekte büyük yer işgal etmeyen ve oluşturulan nesneler çok kullanılmayacak ise sınıf yerine struct kullanılabilir. Nesne Nesneler, sınıflarda tanımı yapılmış değişkenlere anlamlı bir şekilde değer atanabildiği ve sınıfın sahip olduğu metotları kullanabilen bir yapıdır. Daha açık bir ifade ile sınıf şablonunu kullanarak oluşturduğumuz somut yapıdır. Şablondan oluşan bu yapıya artık değer atamaları yapabiliriz. Personel sınıfımızdan bir nesne oluşturmak istediğimizde şu şablona uygun bir tanımlama yapmamız gerekmektedir: SınıfAdı değişkenAdı = new SınıfAdı() ; Personel personel = new Personel(); Personel sınıfından bir nesne oluşturduk. Nesne oluşturmak, bellekte Personel nesnesinin bütün öğelerinin sığacağı kadar bir yer ayrılması demektir. Yapılan işleme de “nesne oluşturmak” denir. Bundan sonra bu sınıfın tüm elemanlarına ve metotlarına ulaşabilmek için personel nesnesinden sonra “.” nokta koyarak işlemler gerçekleştirilebilir.
Nesne Başlatıcıları Sınıflara tanımlı değişkenlere veri atanması ve veriyi okuma sırasında bu işi yapacak bir metoda ihtiyaç duyulmaktadır. Bu işlemleri gerçekleştiren metotlar set/setter (değer atayan) ve get/getter (değer okuyan) metotlar olarak adlandırılmaktadır. Alan Kavramı Alan kavramı nesneye yönelik programlamanın temel ilkelerinden olan sarmalamayı uygularken kullanılır. Bu ilkeye göre, sınıf tanımlaması içindeki değer tutan değişkenlere doğrudan erişim engellenmelidir. Bu değişkenlere değer ataması için de özelliklerden faydalanılır. Bu değişkenlere değer atarken ya da değerlerini okurken tanımlanan bu özellikler kullanılabilir. Bu özelliklere ihtiyaca göre kontroller koyabilir ve güncelleyebiliriz. Sınıftan üretilmiş nesnelerin bu özelliklere doğrudan erişimleri vardır fakat alanlara erişimi yoktur ve olmamalıdır. Aksi durumda, bu alanların değerlerine istenmeyen değer atamaları yapılarak kodda hata oluşmasına neden olacaktır. İsim Alanı Türkçe karşılığını isim alanı olarak çevirebileceğimiz namespace kavramı, programlamada kütüphane kavramına karşılık gelmektedir. Programlamayı kolaylaştırmak için oluşturulan bu kavram, aynı amaca hizmet eden veya belirli başlıklar altında toplanabilen kodların gruplanmasıdır. Program yazarken ihtiyaca göre kullanılacak kütüphanenin projeye dâhil edilmesi ile desteklediği modülleri kodumuzda kullanabiliriz. Kullanımda ihtiyaç duyulmayan kodlar projeye dâhil edilmediği için, bu kütüphaneleri kullanmak, kodun derlenme süresinin daha kısa olmasını sağlarken, kodun büyümesini de engelleyecektir. Örneğin C# dilinde dosya ve klasör işlemleri yapmak için System.IO kütüphanesini, veritabanı işlemleri yapabilmek için de System.Data kütüphanesini projeye eklememiz gerekmektedir. Kütüphanelerin projeye dâhil edilmesi için sayfanın en başında “using” anahtar kelimesini kullanılır. Kütüphaneler sadece .Net kütüphaneleri olmak zorunda değildir. Farklı modüller için de geliştirilmiş harici kütüphaneleri veya kendi yazdığımız kütüphaneleri de farklı farklı projelerimizde kullanabiliriz. Yapıcı Metotlar Yapıcılar, nesne oluşturmak ve nesnenin varsayılan değerlerinin atanmasına imkân sağlamak için tasarlanmış özel metotlardır. Bir sınıfa ait yeni bir nesne (örnek) oluşturulmak istendiğinde, ilgili sınıfın yapıcı metodu çağrılarak nesnemiz bu metoda göre şekillendirilir. Yani nesnenin oluşturulabilmesi için ihtiyaç duyulan tüm düzenlemeler burada yapılır. Yapıcı metotlar parametre alan ve almayan şekilde dizayn edilebilir. Yapıcı metotlar, kendi sınıfları ile aynı isme sahiptirler ve herhangi bir geri dönüş değeri içermezler yani void de yazılmaz. Ayrıca yapıcı metotlar sınıf içerisinde tanımlanmadıysa bile bu sınıftan nesne oluşturulurken otomatik olarak çağırılırlar. Bu metotlara ayrıca kurucu metot da denmektedir.
Yapıcı metotlar hem parametreli hem de parametresiz olarak sınıfımızın içerisinde birden fazla tanımlanabilir. Bunun yanında tıpkı değişkenlerde olduğu gibi, aynı kod bloğu içinde birden fazla, aynı sınıftan nesne oluşturmaya da izin verilmektedir. Kopya Yapıcı Metotlar Kopya Yapıcı metotlar, değişkenleri başka bir nesneden kopyalayarak bir nesne oluşturan ya da bir nesnenin verilerini başka bir nesneye kopyalayan yapıcı metotlara verilen isimdir. Kopya yapıcı metodumuz aslında aynı sınıf tipinde bir parametre içeren parametreli bir yapıcıdır. Kopya yapıcı metodun kullanım amacı, mevcut bir nesnenin değerleri ile yeni bir nesne oluşturmaktır. C# programlama dili, nesneler için kopya yapıcı metot sağlamamaktadır; ancak programda bir kopya yapıcı metot hazırlanmak isteniyorsa, ihtiyaca göre oluşturulabilir. Yıkıcı Metotlar Yıkıcı metotlar, nesneye artık ihtiyacın olmadığı durumlarda çalışan metotlardır. Yıkıcı metotlar da tıpkı yapıcı metotlar gibi otomatik olarak çağrılırlar. Yapıcı metotlar nesne oluşturulurken çağrılır, yıkıcı metotlar ise nesne bellekten silinirken çağrılır. Yapıcı metotlara benzer şekilde yıkıcı metotların da isimleri sınıf ismi ile aynı olmak zorundadır; yalnız bir farkla: yıkıcı metot isminin başına tilda “~” işareti alır. Yıkıcı metotlar parametre alamaz ve geri değer döndüremezler. Parametre alamadıkları için de birden fazla tanımlanma şansı da yoktur. Yapıcı metotlara benzer şekilde, yıkıcı metotları da tanımlamak zorunda değiliz. Tanımlanmadığı zaman yıkıcı metot arka planda otomatik olarak çağrılmaktadır; dışarıdan çağrılamaz. Yıkıcı metotlar daha çok C++ gibi bellek yönetiminin programcı tarafından kontrol edildiği dillerde önem kazanmaktadır. C#, Java gibi yüksek seviyeli dillerde bellek (RAM) temizliği için arka planda çalışan servisler bulunmaktadır. Bu yüzden ihtiyaç olmadıkça yıkıcı metotlar kullanılmaz. This Anahtar Kelimesi C# programlama dilinde her şey sınıflar içerisinde tanımlanır. Kod içerisinde tanımlanmış değişkenler de sınıflar, metotlar ya da kod blokları içinde yer almaktadır. Global yani her yerden erişilebilen değişken ve fonksiyonlara izin verilmez. Bunun yerine “global” yetki verilmesi istenen sınıfın üyesi, “public” erişim denetleyicisi ile tanımlanır. Böylece “public” yani her yerden erişilebilen bir yetkiye sahip olan sınıfın üyesine başka sınıflardan da erişebiliriz. Sınıf içerisindeki metotlarda kimi zaman metot içindeki değişkenler, yani yerel değişkenler ile sınıf değişkenleri aynı isimde tanımlanmış olabilir. Böyle durumlarda, metotlar önceliği kendi yerel değişkenlerine verirler. Erişim Denetleyicileri (Access Modifiers) C# programlama dilinde de diğer nesne yönelimli dillerde olduğu gibi, tüm üyelerin bir erişim seviyesi vardır. Tüm
üyeler sınıflar içerisinde tanımlandığından, sınıflar ve bu sınıfa ait üyelere erişim kısıtlanabilir veya belirli düzeyde erişime izin verilebilir. Erişim denetleyicilerin amacı, sınıftaki üyelerin sınıf, metot ve özellik gibi diğer kod bloklarına nasıl erişeceğinin kurallarını belirlemektir. Erişim denetleyicilere, erişim belirleyicileri de denmektedir. C# programlama dilinde erişim belirleyici tanımlanması zorunlu değildir. Erişim denetleyicisi tanımlanmadığı durumlarda ön tanımlı erişim denetleyicisi olarak “private” verilmektedir. Böylece sadece tanımlı olduğu sınıf içerisinden erişim sağlanır. Erişim denetleyicileri şunlardır:
• Public Erişim Denetleyicisi
• Private erişim denetleyicisi
• Protected erişim denetleyicisi Genişletilebilir Metotlar (Extension) Metotlar Kelime manası genişletilebilir metot anlamına gelen Extension metotlar, .Net içerisinde bulunan sınıflara yeni metotlar eklenebilmesini sağlamaktadır. Sınıf yapılarını modifiye etmeden ilgili sınıf için “extension” metotlar eklememize imkân verir. Bu metotları yazarken uyulması gereken birkaç kural bulunmaktadır. Bunlar;
• Static bir sınıf içerisinde static olarak tanımlanmalıdır.
• Genişletilecek sınıf, ilgili extension metoduna önünde “this” anahtar kelimesi eklenerek metodun ilk parametresi olarak verilmelidir.
• Extension metodu birden fazla parametre alabilir, ama sadece bir parametre “this” anahtar kelimesi ile tanımlanabilir. Daha anlaşılır olması için konuyu bir örnek üzerinde inceleyelim. Örneğimizde integer bir değer alan metodumuz, bu sayının asal olup olmadığını bize döndürsün. public static class ExtensionClass { public static bool AsalMi(this int sayi) { int kontrol = 0 ; int i = 2; while (i < sayi) { if (sayi % i == 0) kontrol++; i++; } if (kontrol != 0) return false ; // sayı asal değil else return true ; // sayı asal; } }
class Program { static void Main(string[] args) { int rastgeleSayi = 7654321; if (rastgeleSayi.AsalMi() ) { Console.WriteLine("Girdiğiniz sayı asaldır."); } else { Console.WriteLine("Girdiğiniz sayı asal değildir."); } } } Örnekteki kodu incelediğimizde, public static bool AsalMi(this int sayi) metodumuz static olarak tanımlanmış ve bool türünde de geri değer döndürecektir. AsalMi metodumuz ise, “this” anahtar kelimesi ile tanımlanmış “int” sınıfını genişleterek, metot içinde kullanılması için “sayi” parametresi ile tanımlanmıştır. Genişletilmiş metodumuzu çağırdığımız Main metodunda ise, “int” türünden tanımlanmış rastgeleSayi değişkenimize bir değer ataması yapıldığını görüyoruz. Bu değişkene ait özelliklerden de nokta işaretinden sonra bizim eklediğimiz “AsalMi” metoduna erişim sağlıyoruz. Bu metodun döndürdüğü değeri de bir kontrol bloğu içinde sonucu yazdırmak için kullanıyoruz. Extension metodumuzu integer sınıfına yazdık ve bu metot sadece integer sınıfı için tanımlıdır ve bu kısmı diğer türler ile genişletmek de mümkündür. Peki, bir metodu bütün sınıflar için geçerli hale getirmek istersek ne yapmalıyız? Bunun için int ifadesi geçen yeri object yapmak yeterli olacaktır. Örneğimizde tüm sınıflar için SayiMi metodu hazırlanmıştır. Parametre ile gönderilen değer bir sayı ise True, değilse False değeri döndürmektedir.