C# Sanal Metotlar,Arayüzler,İstisnai Durumlar,Temsilciler ve Olaylar
Sanal Metotlar
- Temel sınıf türünden bir nesneye türemiş sınıf referansı aktarılabilmekteydi. Bu aktarım sonrasında bazı metotların nesnelere göre seçilmesi istenebilir. Bu durumda sanal metotlar tanımlanır.
- Sanal metotlar temel sınıflar içinde bildirilmiş ve türeyen sınıflar içinde de tekrar bildirilen metotlardır. İsim saklamaya benzemesine rağmen kullanımda farklıdır.
- Sanal metotlar sayesinde temel sınıf türünden bir referansa türeyen sınıf referansı aktarıldığında, temel sınıf referansı üzerinden kendisine aktarılan türeyen sınıfın sanal metodunu çağırabilir.
- Eğer türeyen sınıf sanal metodu devre dışı bırakmamışsa temel sınıftaki sanal metot çağrılır. Çağrılan metodun hangi türe ait olduğu ise çalışma zamanında belirlenir.Hangi metodun çağrılacağının çalışma zamanında belirlenmesine geç bağlama (late binding) olarak isimlendirilir.
- Bu şekilde aynı nesne referansı üzerinden bir çok sınıfa ait farklı versiyonlardaki metotların çağrılabilmesi çok biçimlilik (polymorphism) olarak adlandırılır.
- Sanal metot bildirmek için virtual anahtar sözcüğü kullanılır.
- Türeyen sınıfta, temel sınıftaki sanal metodu devre dışı bırakmak için override anahtar sözcüğü kullanılır.
- Türeyen sınıfta devre dışı bırakılan metotların temel sınıftaki sanal metotların ismi ile aynı olmalıdır.
- Türeyen sınıfta devre dışı bırakılan metotların parametrik yapısı temel sınıftaki metodun parametrik yapısı ile aynı olmalıdır.
- Statik metotlar sanal olarak bildirilemez.Türeyen sınıflar, temel sınıftaki sanal metotları devre dışı bırakmak zorunda değildir. Bu durumda temel sınıf referansları üzerinden temel sınıfa ait metot çağrılır.
- using System;
- class A
- {
- virtual public void Metot()
- {
- Console.WriteLine("A sınıfı");
- }
- class B:A
- { override public void Metot()
- {
- Console.WriteLine("B sınıfı");
- } static void Main()
- {
- A nesneA=new A(); B nesneB=new B(); nesneA=nesneB; nesneA.Metot();
- }
- }
- Bu program ekrana B sınıfı yazacaktır.
- Dikkat ettiyseniz bu programın öncekinden tek farkı A sınıfına ait metodun başına virtual anahtar sözcüğünün getirilmesi ve B sınıfına ait metodun başına da override anahtar sözcüğünün getirilmesi.
- Ana sınıftaki virtual anahtar sözcüğüyle ana sınıfa ait metodun bir sanal metot olmasını, türemiş sınıftaki override anahtar sözcüğüyle de ana sınıfa ait aynı adlı sanal metodun görmezden gelinmesini sağlandı. Bu sayede NesneA nesnesinin gizli türüne ait metot çalıştırıldı.
Özet (Abstract) Sınıflar
- using System;
- abstract class A
- {
- public string Metot()
- { return "Deneme"; }
- }
- class B:A
- { static void Main()
- {
- B nesne1=new B();
- Console.WriteLine(nesne1.Metot());
- //A nesne2=new A();
- //Yukarıdaki satır olsaydı program hata verirdi. Çünkü özet sınıflar için nesne oluşturulmaz
- }
- }
- Özet metotlar da yine abstract anahtar sözcüğüyle tanımlanır. Bu tür metotların gövdesi yoktur.
- Türeyen sınıfta mutlaka devre dışı bırakılmalıdır. Özet sınıflarda yapı itibariyle sanal oldukları için ayrıca virtual kullanılmaz.
- abstract public void Metot();
- Özet sınıflar içinde özet olmayan metotlar bildirilebilir. Fakat tersi özet olmayan sınıflarda özet metotların tanımlanması söz konusu değildir.
- Özet metotlar türeyen sınıfta devre dışı bırakılabilmeleri için private olarak tanımlanamazlar. public ya da protected olabilirler.
sealed Anahtar Sözcüğü
- Bazı durumlarda sınıflardan türetme yapılması istenmeyebilir. Bunu sağlamak için sınıf tanımlamasının başına sealed anahtar sözcüğü eklenir.
- sealed class Sinif
- {
- }
- Sınıflardan türetme yapılmaması türeyen sınıfın anlamsız olması ya da bazı üyelerin güvenliğini sağlamak olabilir. Tüm üyeleri statik olan sınıflar için de kullanılabilir.
- abstract (özet) sınıflar sealed olarak işaretlenemez.
- sealed sınıflara ek olarak static sınıflar ve yapılar da türetilmeyi desteklemez.
Arayüzler (Interfaces)
- Özet sınıfların benzeri olan bir yapı da arayüzlerdir (interface), diğer sınıflar için ara yüz görevini üstlenir.
- Bütün metotları ve özellikleri özet olarak bildirilmiş sınıflardan çok fazla bir farkı yoktur. Dolayısıyla arayüzlerdeki metot ve özelliklerin gövdesi yazılamaz.
- Arayüzler kısaca kendisini uygulayan sınıfların kesin olarak içereceği özellikleri ve metotları belirler.
- Arayüzler, interface anahtar sözcüğü ile bildirilirler. Bir arayüzde özellik, metot, indeksleyici (indexer), temsilci (delegate) ve olay (event) bildirimi yapılabilir. Arayüz tanımlamalarının zorunlu olmasa da başına “I” harfinin eklenmesi tanımlamanın arayüz olduğunun kolayca anlaşılmasını sağlar.
- using System;
- interface arayüz
- { void metot1(); }
- class sınıf1:arayüz
- { public void metot1()
- { Console.WriteLine("sınıf1'in metot elemanı"); }
- }
- class sınıf2:arayüz
- { public void metot1()
- { Console.WriteLine("sınıf2 nin metot elemanı"); }
- }
- public class start
- { static void Main()
- { arayüz a;
- sınıf1 s1=new sınıf1();
- sınıf2 s2=new sınıf2();
- a=s1;
- a.metot1();
- a=s2;
- a.metot1();
- }
- }
Arayüzlerin Uygulanması
- Arayüzlerin uygulanması sınıf türetmeyle aynı şekilde yapılır. Örnek:
- class A:IArayuz { //IArayuz arayüzündeki bütün elemanları içermeli. }
- Sınıflar arasında çoklu türetme olmamasına rağmen arayüzler çoklu olarak uygulanabilir. Uygulanacak arayüzler virgül ile ayrılır:
- class A: Arayuz1, Arayuz2 { //Hem Arayuz1 hem de Arayuz2 arayüzündeki bütün elemanları içermeli. }
- Arayüzler de sınıf türetmeyle aynı şekilde birbirlerinden türetilebilir. Bu durumda türemiş arayüz, ana arayüzün taşıdığı bütün elemanları taşır.
- Sınıflardan farklı olarak arayüzleri birden fazla arayüzden türetebiliriz. Örnek:
- interface Arayuz1 { int Metot1(); }
- interface Arayuz2 { string Metot2(); }
- interface Arayuz3: Arayuz1, Arayuz2 { double Metot4(); }
- Burada Arayuz3'ü kullanan bir sınıf her üç metodu da içermelidir.
Partial (Kısmi) Tipler
- Şu ana kadar tanımlanan tip bildirimleri tek bir proje dosyası içersinde bulunmaktaydı. Oysaki bir projede birden çok dosya bulunabilir.
- Sınıf, arayüz ve yapı tanımlamaları partial anahtar sözcüğü ile birden fazla dosyaya dağıtılabilir. Bütün dosyadaki tanımlamalar tek bir bildirimi göstermektedir. (isim alanları tanımlarken de benzer bir durum söz konusuydu.)
- Birleştirilmesini istediğimiz bütün aynı isimli türleri partial olarak bildirmeliyiz. Yalnızca birisini partial olarak bildirmek yeterli değildir.
- Sınıflar, yapılar ve arayüzler partial olarak bildirilebilir.
- Kısmi türlerden biri sealed ya da abstract anahtar sözcüğüyle belirtilmişse diğerinin de belirtilmesine gerek yoktur.
- Partial türlerin partial olarak bildirildi diye illaki başka bir dosyayla ilişkilendirilmesine gerek yoktur.
- Partial türler minimum üye eleman düzeyinde iş görürler. Yani aynı metodun gövdesinin bir kısmını bir dosyada, başka bir kısmını başka bir dosyada yazmak partial türler ile de mümkün değildir.
İstisnai Durumlar
İstisnai Durum Yönetimi (Exception Handling)
- Program ne kadar iyi yazılırsa yazılsın hataların oluşma olasılığı bir çok durumda mümkündür.
- Özellikle çalışma anında meydana gelebilecek hatalar kod yazılırken tespit edilemeyebilir.
- Tüm hatalara karşı tek tek tedbir almak çok zor bir iştir.
- Bu yüzden modern dillerde çalışma anında meydana gelebilecek hataları yakalamak için bir hata yakalama mekanizması mevcuttur.
- Çalışma zamanında beklenmeyen bir hata sonucunda oluşturulan nesnelere istisnai durum sınıf nesneleri denir. .NET sınıf kütüphanesinde çok sık oluşabilecek hatalara karşı istisnai durum sınıfları tasarlanmıştır. Bu sınıflar hata ile ilgili çeşitli bilgileri tutmaktadırlar.
- .NET sınıf kitaplığında istisnai durum sınıfı hiyerarşisindeki en temel sınıf System isim alanı içersinde yeralan System.Exception’dır. Exception sınıfı oluşan hatalar için çok genel bilgiler verdiğinden türemiş diğer bilgiler sınıflar kullanılır:
- SystemException, ArgumentException, StackOverFlowException, ArithmeticException, IOException, IndexOutOfRangeException…
- İstisnai durumları yakalamak için dört tane anahtar sözcükten faydalanılır:
- try, catch, finally ve throw
- try, catch ve finally sözcükleri birer kod bloğunu temsil ederken, throw ise bir hatanın nesnesinin oluşturulmasını sağlar.
- try : Hatanın kontrol edileceği kod bloğunun yazılacağı kısımdır. Yani bu blokta bir hata meydana gelirse ilgili hata sınıf nesnesi oluşturulacaktır.
- catch : try bloğunda yakalanan hataya göre işlemlerin yapılmasını sağlayan bloktur.
- finally : try ve catch bloklarında açılan kaynakların kapatılması burada gerçekleşir. Kodlar hata oluştursa dahi çalıştırılır. Bu bloğu belirtme zorunluluğu yoktur.
- throw : try bloğu içersinde belirli bir hata olduğunda ilgili hata sınıfı nesnesini oluşturmak için kullanılır. Eğer try içindeki nesneler zaten hata oluşturuyorsa throw’un kullanılmasına gerek olmayabilir.
İstisnai durum sınıfları
- System isim uzayında tanımlı, sıkça kullanılan kural dışı durumlar aşağıda verilmiştir.
- ArrayTypeMismatchException: Depolanmakta olan değerin tipi dizi tipi ile uyumsuz.
- DivideByZeroException: Sıfıra bölünme hatasında fırlatılır.
- IndexOutOfRangeException: Dizi indexi sınıf dışına taştığında fırlatılır.
- InvalidCatsException: Programın çalışması sırasında geçersiz tür dönüşümü yapıldığında fırlatılır.
- OverflowExcepiton: Aritmetik taşma meydana geldiğinde fırlatılır.
- NullReferanceExcepiton: Null referans üzerinde işlem yapıldığında fırlatılır.
- StackOverflowException: Yığın taşmıştır.
- FormatException: Metotlarda yanlış formatta parametre gönderildiğinde fırlatılır.
- ArithmeticExcepiton: Bu sınıf ile DivideByZeroException ve OverflowException hataları yakalanabilir. Aritmetik işlemler sonucunda oluşan istisnai durumlarda fırlatılır.
- OutOfMemoryExcepiton: Programın çalışması içi yeterli bellek miktarı olmadığında fırlatılır.
Temsilciler
- Temsilcilerin nesneleri oluşturulabilir ve bu nesneler metotları temsil ederler. Temsilci bildirimi delegate anahtar sözcüğü ile yapılır. Bir temsilci bildirim taslağı şu şekildedir:
- delegate dönüşdeğeri temsilci(parametreler) delegate int temsilci(int a,string b);
- Temsilcilerin kullanılmasının amacı derleme zamanında belli olmayan metotların çalışma zamanını belirlemektir.
- Temsilciler kendi imzalarına uygun herhangi bir metodu temsil edebilirler. Bu metotlar statik de olabilir.
- delegate bir veri tipi olduğundan erişim belirteci ile tanımlanabilir.
- using System;
- class delegeler
- { public delegate void temsilci();
- public static void Bilgisayar()
- { Console.WriteLine("Bilgisayar Öğretmenliği");
- }
- public static void Elektronik()
- { Console.WriteLine("Elektronik Öğretmenliği");
- }
- public static void Main()
- { temsilci nesne=new temsilci(Bilgisayar);
- nesne();
- nesne=new temsilci(Elektronik);
- nesne();
- }
- }
Çoklu Temsilciler
- Bir temsilci birden fazla metodu temsil edebilir. + ve – operatörleri ile temsilciye metot ekleme ve çıkarma yapılabilir.
- + ve - metotları yerine daha pratik olması için += ve ‐= de kullanılabilir.
- Çoklu temsilci çağrıldığında metotlar temsilciye eklenme sırasına göre çalıştırılır.
- delegate void temsilci(int a);
- class deneme
- { public static void Metot1(int a)
- { Console.WriteLine("Metot1 çağrıldı." + a); -
- public static void Metot2(int a)
- { Console.WriteLine("Metot2 çağrıldı." + a); -
- public static void Metot3(int a)
- { Console.WriteLine("Metot3 çağrıldı." + a); -
- }
- class Program
- { static void Main()
- { temsilci nesne = null;
- nesne += new temsilci(deneme.Metot2); nesne += new temsilci(deneme.Metot1);
- nesne += new temsilci(deneme.Metot3); nesne(1);
- Console.WriteLine("***"); nesne -= new temsilci(deneme.Metot1);
- nesne(2);
- }
- }
Delegate Sınıfı
- Kendi yarattığımız temsilciler gizlice System isim alanındaki Delegate sınıfından türer. Dolayısıyla kendi yarattığımız temsilcilerin nesneleri üzerinden bu sınıfın static olmayan üye elemanlarına erişebiliriz.
- using System;
- class Ana
- { delegate void temsilci();
- static void Metot1()
- { Console.WriteLine("Metot1"); }
- static void Metot2()
- { Console.WriteLine("Metot2"); }
- static void Main()
- { temsilci t=new temsilci(Metot1);
- t+=new temsilci(Metot2); t+=new temsilci(Metot3);
- Delegate d=t; temsilci c=(temsilci)d; // tür dönşümüne dikkat
- c(); } }
- Ayrıca Delegate sınıfı özet bir sınıf olduğu için new anahtar sözcüğüyle bu sınıf türünden nesne yaratamayız. Yalnızca kendi yarattığımız temsilci nesneleri üzerinden bu sınıfın üye elemanlarına erişebiliriz. Delegate sınıfının bazı üye elemanları:
- GetInvocationList() : çoklu temsilci yapısında bulunan metotları bir delegate dizisi olarak geri döndürür.
- DynamicInvoke(object[] parametreler) : bir temsilcinin temsil ettiği metotları tek tek çağırmak için kullanılır.
- Combine(Delegate[] temsilciler): Çoklu bir temsilciye temsilciler ile belirtilen Delegate dizisindeki metotları ekler
Olaylar (Events)
- Olaylar, temsilcilerin özel bir formudur. Olaylar ile yapılan işlemlerin tamamı temsilciler ile de yapılabilir.
- İşlemleri sadeleştirmek amacıyla event anahtar sözcüğü tanımlanmıştır.
- *Erişimbelirleyici+ event *temsilci türü+ *olay adı+;
- using System;
- delegate void OlayYoneticisi(); //Olay yöneticisi bildirimi
- class Buton //Olayın içinde bulunacağı sınıf bildirimi
- { public event OlayYoneticisi Click; //Olay bildirimi
- public void Tiklandi() //Olayı meydana getirecek metot
- { if(Click!=null) Click(); }
- }
- class AnaProgram
- { static void Main()
- { Buton buton1=new Buton();
- buton1.Click+=new OlayYoneticisi(Click); //Olay sonrası işletilecek metotların eklenmesi
- buton1.Tiklandi(); //Olayın meydana getirilmesi.
- }
- //Olay sonrası işletilecek metot
- static void Click() // Olaydan sonra çalıştırılacak metot ya da metotların static olma zorunluluğu yoktur.
- { Console.WriteLine("Butona tıklandı."); }
- }// Bu program ekrana Butona tıklandı.
Henüz Yorum Yapılmamış, İlk Yorumu Siz Yapın