static Kavramı1
Transkript
static Kavramı1
static Kavramı1 İçinde bulunduğu sınıftan nesne oluşturulmadan veya hiç bir nesneye referans olmadan kullanılabilen üyeler static olarak nitelendirilir. Metotlar ve alanlar static olarak tanımlanabilir. static Metodlar static olma durumunun en bilinen örneği Main() metodudur. Main(), herhangi bir nesne oluşturulmadan önce çağırılması gerektiği için static olarak tanımlanmıştır. Başka bir deyişle de bir nesne metodun üreteceği sonucu etkilemeyecek ise o metot static olarak tanımlanır. Diğer adı ile sabit metotlar olarak da bilinirler. Static olarak tanımlanan bir metoda program çalıştığı sürece erişilir, böylece sadece bir metot ile birden çok nesne çağırılır. Bu metotlar bir nesne ile var olan metotlar değil, bir sınıfın kendisinde tanımlanmış olan metotlardır. Örnek verirsek Math sınıfının Pow metodu bir statik metottur. Ve bu metot ile bir değerin üssünü yani üssel ifade değerini hesaplayabiliriz. Bir metodu static olarak tanımlayabilmek için metot isminin hemen önünde static deyimini kullanırız. Oluşturulan veya oluşturulmuş olan her bir statik metodu ilgili sınıfın adının ardından nokta (.) kullanarak metot adını belirterek kullanabiliriz. Yani SınıfAdı.MetotAdı(ilgili parametre(ler)) şeklinde kullanılır, örnek verirsek; Math.Sqrt( 2500.0 ) Bunu kullanarak ilgili değerin sonucunu 50 buluruz. Burada kullanmış olduğumuz Math sınıfının içinde yer alan static Sqrt metodudur. Bu metot ile ilgili argümanın karekök değerini buluruz. classMatematik publicstaticintToplam intx,inty intz x y; returnz; Görüleceği üzere herhangi bir nesneye bağımlı olmadan bu sınıfı ve ilgili static metodu kullanabiliyoruz. Math sınıfında yer alan tüm metotlar statik metottur. Dolayısı ile hepsinin kullanımı üstte görüldüğü gibidir, yani önce Math sınıfı yazılır sonra nokta (.) ve daha sonra da ilgili metodun adı gelir. Örnek olarak mesela sık sık kullanmış olduğumuz Console.WriteLine(), Consol.Write() bunlarda static metotlardır. Her ikisi de Console sınıfında yer alan static metotlardır. classProgram staticvoidMain string args intsonuc Matematik.Toplam 3,5 ; Console.WriteLine sonuc ; Yukarıdaki örnekte "Matematik" sınıfı altında "Toplam()" isimli static metodu oluşturuldu ve program sınıfının static Main() metoduna verilebilecek her tamsayı x ve y değerleri için toplama işlemi gerçekleşir. Böylece static olarak tanımlanmış sınıf metotlarına static olmayan sınıf üyelerininde 1 Bu başlık altındaki yazılar http://bidb.itu.edu.tr/seyirdefteri, http://onursalkaya.blogspot.com.tr, http://www.ismailgursoy.com.tr/ internet adreslerinden yararlanılarak derlenmiştir. erişebileceği görülür. Aşağıdaki örnekte ise static olmayarak tanımlanın bir metodun static "Toplam()" metoduna ulaşabildiği görülür. publicintToplamlar intx,inty,intm intsonuc 0; for inti 0;i m;i sonuc Toplam x,y ; returnsonuc; static bir metot olan "Toplam()" metodundan static olmayan Toplamlar metoduna erişilmek istenirse "An object reference is required for the nonstatic field, method, or property StaticKavrami.Matematik.Toplamlar(int, int, int)" hatası ile karşılaşılır. static Alanlar Bir sınıf içerisinde bulunan alanlarda static olarak tanımlanabilir. Eğerstatic kavramı yok ise sınıftan nesne oluşturulması gerekir. Bir değişken static ise sınıfın tamamıyla ilgilidir ve buna "sınıf alanı" adı verilir; static değil ise bir nesneyle ilgilidir, buna da "nesne alanı" adı verilir. Sınıf alanları, nesneye değil sınıfa ait bilgiler içerir. Ayrıca, sınıf alanlarından oluşturulan her nesne için bellekte bir tane sınıf alanı vardır ve her şekilde ona erişilir. Aşağıdaki örnekte "Matematik" sınıfına ait y ve z nesne örnekleri oluşturulmuştur ancak bunların değerleri static olan x değerine eşittir. x değişkenine de metotta olduğu gibi SınıfAdı.DeğişkenAdı şeklinde ulaşıldığı görülür. static alanların bir diğer özelliği ise çalışma zamanında değerlerinin değiştirilebiliyor olmasıdır. Bunun için aşağıdaki örnek uygulamada "xDeğistir()" adındaki metot kullanılmştır. classMatematik publicstaticdoublex 5.5; publicvoidxDegistir inty x y; classProgram staticvoidMain string args Matematiky newMatematik ; Console.WriteLine Matematik.x ; Matematikz newMatematik ; Console.WriteLine Matematik.x ; z.xDegistir 4 ; Matematikt newMatematik ; Console.WriteLine Matematik.x ; Bu örneğin çıktısında y ve z isimli nesnelerinin 5.5 değerini aldıklarını, z değeri üzerinden "xDegistir()" metodu çağırıldıktan sonra, oluşturulan t isimli nesne örneğinin static x değişkeninin yeni değeri olan 4 ü aldığı görülür. Yeni bir metot çağrısı ile static x değişkeninin değeri değiştirilene kadar oluşturulan her nesne örneği 4 değerini alır. static Yapıcı Metod (constructors) Static yapıcı metodu çoğunlukla bir sınıfın static değişkenlerine ilk nesne örneği oluşturulduğunda bir kereliğine değer atmak için kullanılır. publicclassDikdortgen publicstaticintkontrolAlani 20; staticDikdortgen kontrolAlani 35; static Sınıflar Bir sınıf static olarak tanımlanıyosa, içerisindeki bütün üyeler static olarak tanımlanmak zorundadır. Amaç tüm üyeleri static olmaya zorlamaktır. Static sınıfların özellikleri aşağıdaki gibidir: -C# 2.0 ile birlikte static anahtar sözcüğü class'lara da uygulanabilir bir hale geldi. -Bir class'a static anahtar sözcüğü uygulandığından içindeki tüm üyeleri static olmaya zorlamış olur. -Tek bir özel nesne örneği, sınıfın kullanıldığı anda ram'in Static bölgesine çıkar. -Static sınıflar new ile örneklenemezler. Dolayısıyla heap'te nesne örnekleri bulunmaz. publicstaticclassKare publicstaticdoublekenar; publicstaticdoubleCevre returnkenar*4; publicstaticdoubleAlan returnkenar*kenar; publicclassProgram publicstaticvoidMain Kare.Kenar 36.84; Console.WriteLine "KareÖzellikleri" ; Console.Write "Kenar:" ; Console.WriteLine Kare.kenar ; Console.Write "Cevre:" ; Console.WriteLine Kare.Cevre ; Console.Write "Alan:" ; Console.WriteLine Kare.Alan ; sealed Kavramı 2 Nesne yönelimli programlamanın temel felsefelerinden biri de kalıtımdır. sealed, sınıflara ve üyelere(metot ve property) uygulanabilen bir anahtar sözcüktür. Anlamı; kapalı, mühürlü şeklinde çevirilebilir. Sınıflar için kalıtımı, üyeler için ise override edilmeyi önler. Basit örnekler üzerinden inceleme yapalım. Birbirinden türetilen A,B ve C sınıfları olsun. classProgram:C staticvoidMain string args publicclassA publicstringAProperty get;set; publicclassB:A publicstringBProperty get;set; publicclassC:B publicstringCProperty get;set; Main metodu içerisinde Program tipinden bir nesne örneklediğimizde, Program sınıfının C sınıfından kalıtılması sebebiyle ilgili property’lere erişebildiğimizi görürüz. Zaten kalıtımın temel mantıklarından birisi de budur. 2 Bu başlık altındaki yazılar http://onursalkaya.blogspot.com.tr/ internet adresinden alınmıştır. Projeyi yukarıdaki hali ile derlediğimizde herhangi bir hata almayacağız. Şimdi de amacımız, C sınıfından yapılacak bir kalıtımı önlemek. Bunun için C sınıfına sealed anahtar sözcüğünü uygulamamız yeterli olacaktır. publicsealedclassC:B publicstringCProperty get;set; sealed ile, C sınıfından herhangi bir kalıtım yapılması halinde derleme zamanı hatası alınmasını sağladık. Son hali ile projemizi derlediğimizde aşağıdaki gibi bir hata mesajı ile karşılaşacağız. 'sealedKeyword.Program':cannotderivefromsealedtype'sealedKeyword.C' Program sınıfının, sealed olarak işaretlenmiş olan C sınıfından kalıtamayacağı mesajı aldık. Dolayısı ile artık C sınıfından kalıtım yapamayacağız. Şimdi de A sınıfı içerisine virtual bir metot ekleyelim. Daha sonra da B sınıfında bu metodu override edelim. publicclassA publicvirtualvoidTest Console.WriteLine "AsınıfındakiTestmetoduçalıştı" ; publicclassB:A publicoverridevoidTest Console.WriteLine "BsınıfındakiTestmetoduçalıştı" ; Program sınıfını B sınıfından kalıtalım ve Test metodunu override etmeye çalışalım. Görüldüğü gibi Test metodu da override edilebilir bir metot olarak karşımıza çıktı. classProgram:B publicoverridevoidTest Console.WriteLine "ProgramsınıfındakiTestmetoduçalıştı" ; staticvoidMain string args Programı derlediğimizde hata ile karşılaşmayacağız. Şimdi de B sınıfına giderek Test metodumuzu sealed olarak işaretleyelim. publicclassA publicvirtualvoidTest Console.WriteLine "AsınıfındakiTestmetoduçalıştı" ; publicclassB:A publicsealedoverridevoidTest Console.WriteLine "BsınıfındakiTestmetoduçalıştı" ; Tekrar program sınıfına dönelim ve Test metodunu override etmeyi deneyelim. Artık override edilebilecek üyeler listesinde Test metodunu göremeyeceğiz. Sebebi, sealed ile işaretlenmiş olması, yani artık override edilemeyecek olmasıdır. Derleyiciden yardım almayarak manuel olarak override ettiğimizde ise derleyici tarafından bir hata mesajı alacağız. classProgram:B publicoverridevoidTest Console.WriteLine "ProgramsınıfındakiTestmetoduçalıştı" ; staticvoidMain string args Programı derlediğimizde alacağımız hata mesajı aşağıdaki gibi olacaktır. 'sealedKeyword.Program.Test ': cannot override inherited member 'sealedKeyword.B.Test ' becauseitissealed Framework içerisinden örnek vermek gerekirse; string tipi de sealed olarak işaretlenmiştir. Yani string tipinden kalıtım yapamayız.