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.

Benzer belgeler