aofsorular.com
BİL107U

Ünite 8: Nesneye Yönelik Kavramlar II

PROGRAMLAMA I
Giriş Ünitemizde bahsedilecek kavramlar, nesneye yönelik programlamanın önemli konuları arasında yer almaktadır. Bu kavramları da öğrendikten sonra hem C# programlama dilinin temel fonksiyonlarını bitirmiş hem de nesneye yönelik programlamada kullanılan temel özellikleri öğrenmiş olacaksınız. Bu kavramlar kullanılarak gerçek hayattaki nesnelerin programlama ortamına aktarılması sağlanmaktadır. Nesne yönelimli programlama türü, kod hazırlarken ortaya çıkan karmaşıklığı azalttığı gibi kod boyutunu da kütüphaneler gibi, bir kere yazılan kodun tekrar kullanılması ile azaltmaktadır. Bu yöntemle daha hızlı ve kolay yazılım gerçekleştirilmektedir. Bu kavramlar, nesne yönelimli programlamayı destekleyen dillerde çok benzerlik gösterdiği için, farklı bir dil ile yazılım geliştirirken de bir zorluk yaşanmayacaktır. Çok Biçimcilik (Polymorphizm) Kalıtımda amaç, bir nesnenin birden fazla türün özelliklerini sergilemesini sağlamaktır. Kalıtım yoluyla türetilmiş sınıf, türetildiği sınıftan tüm özelliklerini miras alır. Türetilen sınıftan gelen bazı özelliklerin değiştirilebilmesine ve nesne üzerinden çağırılabilmesine çok biçimlilik denir. Böylece, kalıtım ile türetilen sınıflar, bir miktar da temel sınıfın biçiminde olacaktır. Çok biçimliliği iki başlık altında inceleyebiliriz.
• Kalıtım ile türetilen sınıfların, temel sınıflarının özelliklerini göstermesi
• Temel ve türetilmiş sınıflardaki aynı metotların hiyerarşik olarak önceliklerinin belirlenmesi Metot Üzerine Yazma (Method Override) Override anahtar kelimesi için üzerine yazma, metodu ezme, geçersiz kılma gibi farklı tabirler de kullanılmaktadır. Metotların üzerine yazma da belirli kurallara göre yapılabilmektedir. Bunlara da kısaca değinecek olursak;
• Final ve static olarak tanımlanmış metotlar “override” edilemez.
• Kurucu/Yapıcı “constructor” metotlar “override” edilemez.
• Temel, üst sınıf içinde “private” olarak tanımlı metotlar “override” edilemez.
• Temel, üst sınıftan kalıtım ile alınan metotların dönüş tipleri ve parametreleri değiştirilemez.
• Alt, türetilen sınıftaki “override” olarak tanımlanacak metot, üst sınıftaki metot ile aynı isimde olmalıdır.
• “override” edilecek metot tanımlanırken, “virtual” ve “override” anahtar kelimeleri kullanılmalıdır.
• “override” işlemi uygulanan metodun erişim belirleyicisinin seviyesi yükseltilebilir fakat düşürülemez.
Temel sınıfın yapıcı/kurucu metodunu parametre ile çağırıyoruz. Aynı şekilde, üzerine yazılan “override” metotlarda, temel sınıftaki baz metodun özelliklerinin kullanılması istenirse de “base” anahtar kelimesi ile baz metot çağrılabilir. Metot ezme, üzerine yazma ya da geçersiz kılma anlamlarına gelen “override” ile türetilmiş sınıfta tekrar yazılan, “virtual” anahtar kelimesi ile tanımlanmış metotlarda alt sınıfın metodu çalışır. Yani “virtual” anahtar kelimesi ile tanımladığımız metot artık sanal bir metot olur ve türetilen sınıf içinde aynı isimde farklı bir metot tarafından “override” üzerine yazılarak, aynı isimde farklı işleve sahip bir metot hazırlayabiliriz. Yine kalıtımla ilgili olarak, türetilen sınıfın metoduna işlem önceliği verebilmek için, “virtual” olmayan bir metodu, override edebilmek için “new” anahtar sözcüğünü kullanırız. Soyut Sınıf (Abstract Class) ve Üyeleri Temel sınıf sadece kalıtım amacı ile kullanılacaksa, sınıf oluşturulurken “abstract” anahtar kelimesini kullanırız. Bu sınıfı oluşturabilmek için, sınıfın erişim belirleyicisinden sonra “abstract” anahtar kelimesi yazılır. Soyut sınıflarda metotları hem tanımlayabilir hem de arayüzlerde olduğu gibi metot bildirimi yapabiliriz. Abstract sınıflar metot bildirimine izin verdiği için, arayüzler (interface) gibi kullanılabilir.
• Arayüzlerde “interface” olduğu gibi, soyut “abstract” sınıfların içinde de metot bildirimi yapılırken, normal sınıflarda böyle bir bildirim yapılamaz.
• Soyut sınıftan türetilen sınıflarda, bildirimi yapılan metotların tanımlanması da gerekmektedir.
• Soyut sınıfların amacı kalıtım olduğundan, bu sınıflardan normal sınıflar gibi “new” anahtar kelimesi ile yeni nesne oluşturulamaz. Soyut sınıflardan sadece yeni sınıflar türetilebilir.
• Arayüzlerde sadece metot bildirimine izin verilirken, soyut sınıflarda hem metot bildirimine hem de metot oluşturulmasına izin verilmektedir.
• Soyut bir sınıf oluşturuluyorsa, bu sınıfın içinde en az bir tane soyut metot olması beklenmektedir. Tam tersi şekilde, bir sınıfın içinde bir soyut metot tanımı yapıldıysa, o sınıfın da soyut “abstract” olarak tanımlanması gerekmektedir.
• Bir sınıf sadece bir soyut sınıftan türetilirken, aynı sınıf birden fazla arayüzden kalıtım ile türetilmiş olabilir. Mühürlü Sınıf (Sealed Class) ve Üyeleri Mühürlü “Sealed” sınıflar, nesne yönelimli programlamanın kalıtım özelliğini engellemek istediğimiz durumlarda kullanılır. Kod yazarken kimi zaman başka sınıfların, hazırlanan sınıftan kalıtım yolu ile türetilmesini istemeyebiliriz. Sabit özelliklere ve metotlara sahip bir
sınıfa ihtiyacımız olabilir. Bu duruma genellikle güvenlik konularında denk gelebiliriz. C# programlama dilinde, bu ihtiyacı karşılamak için “sealed” anahtar kelimesi kullanılmaktadır. “sealed” olarak tanımlanan bir sınıf, alt sınıflara kalıtım veremez, yani başka bir sınıfın temel “base” sınıfı olamaz. Net kütüphanesi içinde bulunan String ve Stringbuilder sınıfları mühürlü sınıflara örnek olarak verilebilir. Sınıflar gibi metotlar da “sealed” anahtar kelimesi ile tanımlanabilir. Bu metotlar da türetilen sınıflar da “override” üzerine yazılamaz. Sadece “override” olarak işaretlenmiş metotlar “sealed” olarak tanımlanabilir. Soyut “abstract” sınıflar “sealed” olarak tanımlanamazlar. Static olarak tanımlanmış sınıflar ve yapılar da “sealed” tanımlı sınıflar gibi türetilmeye izin vermezler. Arayüz (Interface) Arayüzler, belirli fonksiyonların gerçekleştirilebilmesi amacıyla metot şablonları ve tanımlar içerirler. Bu arayüzleri kullanan sınıflarda, tanımlanan metotların içlerinin doldurulması, tanımlanması zorunludur. Arayüzler, yapı itibarıyla tüm elemanları abstract olan ve tanımlı değişkeni olmayan abstract yani soyut sınıflara benzerler. C# programlama dilinde arayüzlerin tanımlanması için “interface” anahtar kelimesi kullanılmaktadır. Arayüzler, fark edilebilmeleri amacıyla geleneksel olarak isimleri “I” harfi ile başlatılır fakat bu kullanım zorunlu değildir. Arayüz oluştururken uyulması gereken kısıtları da şu şekilde sıralayabiliriz:
• Arayüzler veri elemanı yani değişken içeremezler.
• Arayüzde tanımlı fonksiyon ve özelliklerin gövdeleri yoktur, sadece şablon şeklinde tanımlıdır. Metot bildiriminden sonra “;” işareti konulmalıdır.
• Arayüzde tanımlı elemanların erişim belirleyicileri ön tanımlı olarak “public” tanımlıdır, başka bir erişim belirleyici kullanılamaz. Kullanılması durumunda derleyici hata verecektir.
• Arayüz elemanlarında abstract, virtual gibi kalıtım yapılabileceğine dair belirteçler kullanılmaz. Tüm elemanlar abstract tanımlı gibi kullanılır.
• Arayüz türünden referans tanımı yapılabilir fakat “new” operatörü ile yeni nesne oluşturulamaz.
• Bir sınıf sadece bir sınıftan türetilebilir iken, birden fazla arayüzü destekleyebilir.
• Arayüzler de sınıfların diğer sınıflardan türetildiği gibi diğer arayüzlerden türetilebilir. Böylece türetildiği arayüzün bütün elemanlarını da taşırlar.
• Arayüzler, yapıcı (constructor) ve yıkıcı (destructor) metot içeremezler.
• Yapıların “struct”, başka sınıflardan türetilmesine izin verilmemektedir. Lakin yapılar da birden fazla arayüzü destekleyebilirler.
• Bir sınıf ya da bir yapı “struct”, bir arayüzü destekliyorsa ilgili arayüz elemanlarının “public” olarak tanımlanması zorunludur.
• Arayüzler çok biçimli etkiye sahiptir. Bir arayüz referansına, o arayüzü uygulayan sınıf referans olarak atanabilir. Bu referans ile arayüzdeki metotlar çağrılabilir.
• Sınıf isminden sonra gelen “:” işaretinden sonra bir sınıf geliyorsa, buna türetilme, miras alma, kalıtma ya da “extend” etmek diyebiliriz. Eğer bir arayüz geldi ise buna da uygulamak ya da “implement” etmek diyebiliriz. İstisnai Durum Yakalama (Exception Handling) C# programlama dilinde kodlama sırasında yapılan hatalar ikiye ayrılır:
1. Derleme zamanı hataları (Compiler Error)
2. Çalışma zamanı hataları (Runtime Error) Derleme zamanı hataları, program yazarken yanlış sözdizimi, hatalı metot ve parametre kullanımı, erişim belirleyicilerin doğru kullanılmaması gibi “syntax” yazım hatalarından kaynaklanır. Bu hataların tespit edilmesi kolaydır. Kod yazarken kullanılan editör bile bu tarz hataları göstermektedir. Bu hatalar düzeltilmeden yazılan kod derlenemez. Çalışma zamanı hataları ise genelde mantıksal hatalardan kaynaklanır. Bu hatalar program çalışırken alındığı için tespit edilmesi daha zordur. İstisnai durum yakalama, yani temel işlevi hataları yakalamak olan bir mekanizma ile tüm bu çalışma durumu hatalarının kontrol altına alınarak, zamandan tasarruf edilmesini sağlayacaktır. Ayrıca olası hata durumlarında programın sonlanması yerine alternatif yolların uygulanmasına izin vererek kullanıcıya kesintisiz bir kullanım sağlayacaktır. C# programlama dilinde, hataların yakalanıp yönetilmesi için Exception sınıfı kullanılmaktadır. try bloğunda bir hata oluştuğu zaman, oluşan hata türünden bir nesne oluşturulur ve catch bloğuna parametre olarak gönderilir. Bu olay, try bloğunun “hata fırlatması” ve catch bloğunun da “hata yakalaması” olarak adlandırılır. SystemException sınıfından türetilmiş farklı sınıflar ile birçok hata türü yönetilebilir. Bunlar tablo 8.1’de görülebilir. Birden fazla catch bloğu hazırlanarak farklı türlerde hataların yakalanması sağlanabilir. Oluşacak hata türüne göre sadece ilgili catch bloğu çalıştırarak, hataya uygun yönlendirme yapılabilir. FormatException sınıfı ile girilen sayılarda oluşabilecek tür hatasında bu catch bloğu çalışacaktır. Kodun içerisinde bir
dizi yok fakat hata yakalama yapısının çoklu catch bloklarını desteklediği görülmesi için IndexOutOfRangeException sınıfını da ekledik. Bu blok ise, kod içinde kullanılan dizilerde oluşabilecek sınır aşma, dizide olmayan elemana erişme isteklerinde hata fırlatacaktır. Hata sınıflarında ortak kullanılan özellikler vardır. Bunları da kısaca inceleyelim:
• HelpLink: Programcı tarafından oluşturulmuş, hata ile ilgili yardım dosyasının yolunu tutar.
• InnerException: catch bloğu içinden fırlatılan hataya yol açan durumun Exception nesnesi.
• Source: Hatayı gönderen uygulama ya da nesnenin adıdır.
• StackTrace: Hatanın oluştuğu yer ile ilgili detaylı bilgi verir.
• TargetSite: Hatayı fırlatan metot ile ilgili bilgi verir.
• ToString: Hata ile ilgili oluşturulan metnin tümünü string olarak verir.