OOP concept : Abstract class

Üst not: OOP( object oriented programming) türkçe olarak nesneye dayalı programlama. Concept ise içerik gibi bir anlama sahip.

Yavrum şurdan bir “Abstract Class” uzatabilir misin sana zahmet?

Bugün object orient programming temellerinden olan “abstract class“ların kullanımına ve saz arkadaşlarına(abstract method, virtual, sealed gibi keyword’ler) dair inceleme yapacağım. Bence bir yapıyı veya yaklaşımı kullanırken en önemli soru, hangi durumlara uygun olduğunun belirlenmesi, yani nerelerde kullanmak gerektiğinin anlaşılmasıdır. Öbür türlü sağa sola “bodosloma pattern”‘i ile abstract  class atalım, generic interface çakalım, static methodu gömelim diye diye tadından yenmez spagetti kodlarla başbaşa kalınabilir.  “Abstract class kullanıyım hadi burda” denilecek durumlar nelerdir bunu kavradıktan sonra implementasyon işi daha kolay atlatılacak bir süreç.  Abstract class özelliklerini sayarak yola çıkalım:

  • new keyword’ü ile kullanılamaz. Yani bir instance’ı alınamaz.
  • Abstract methodun olduğu sınıf(class) mutlaka abstract olmalıdır.
  • Abstract class’lar sealed keyword’ü ile ifade edilemez. Sealed keyword’ünün inheritance’ı engellemesi hasebiyle.
  • Abstract olmayan class’lar abstract bir class’tan türeyebilir.Bu durumda abstract class’ın methodlarını override etmek durumundadırlar.
  • Abstract sınıf üyeleri üstü kapalı (implicitly) olarak virtual’dır.
  • Abstract methodların implementasyonları yoktur. Sadece tanımları yapılır.
  • Abstract methodlar paşa paşa override edilir.

İmplementasyon olarak bakıldığında az çok “interface” kavramına benzemektedir. Bir abstract class ihtiyacı benzer işleri farklı şekillerde yapan birden çok sınıfın mevcut olduğu senaryolarda düşünülebilir. “interface“den farkına gelince interface içerisinde tanımlanan tüm methodlar bu interface’den türüyen class’larda implemente edilmek durumundadır. Oysa abstract class içerisinde sadece imzası olan “virtual method“lar olabileceği gibi abstract class‘ın kullandığı  somut(concrete) methodlar yer alabilir.  Bu bakışta bir abstract class, bu abstract class’tan türeyen diğer class’larda ortak davranışlara sahip olan methodları tüm sınıfı implemente etmeden kullanabilmeyi sağlar.  Metaforun dibi. İnterface ile aralarındaki en belirgin fark budur.  Böylece aynı kodu tekrar tekrar yazmaya gerek kalmaz.  Abstract class kullanmaya uygun bir senaryoyu “is-a” sorusuna cevap verebilecek birden çok obje var mı? sorusunu sorarak anlamak mümkün.Örnek olarak: Kedi bir hayvan mı? Hayvan. Köpek bir hayvan mı? Hayvan. At bir hayvan mı? Hayvan. O zaman burda “abstract class” kullanmak uygun olabilir. Hayvan sınıfı abstract olmaya elverişli. Çünkü bir kedinin kendine has davranışları olmasına rağmen, bir köpek ile ortak davranış veya özellikleri de bulunmaktadır. O yüzden Hayvan bir üst tanım (Abstract Class) olmaya gayet elverişli. Hayvan sınıfında yer alan örnek  ses çıkarma methodu kedi için “miyav”, köpek için “hav hav” gibi kendine has implementasyonlara sahip olabilir. Atı sevmediğimden değil bir at kişnemesini nasıl yazarım bilemediğimden yazmadım. Bilen varsa yeşillendirsin.

Yukarda saydığım kural setine atıfta bulunan bir kod blokları şu şekildedir:

instanceabstractclass

Visual Studio daha derlenmeden bile altını çiziyor ve aklımızı alıyor. Abstract class’tan bir instance oluşturamayacağımız gerçeğini hunharca yüzümüze vuruyor.

 Madde 1  

madde2

Abstract bir method tanımlamak için, methodun bulunduğu class’ta abstract olmalıdır.  Yukardaki screenshot’ta üzere “beyaz yakalı sıradanlıktan kırılan normal class” abstract bir method’u barındıramıyor. “Maaşla zengin olunmaz normal class” diyerek yola devam edelim.

  Madde 2 

madde3

Yukardaki screenshot’ta da görüldüğü üzere bir abstract bir sınıf sealed ile işaretlendiğinde “easy champion” kıvamlı uyarı mesajı karşımıza çıkar. Sealed bir class türetilemeyeceğinden, abstract class ise ziyadesiyle türetilmesi gereken bir yapı olduğundan bu iki keyword’ü bir arada kullanmak mümkün değildir.

   Madde 3 

madde4

DoSome abstract methodunu  override ederek NormalClass içerisinde kendi implementasyonu ile kullanmak mümkündür.  Bu implementasyon yapılmadığı zaman aşağıdaki gibi bir uyarı ile karşılaşılır.

madde4_1

Abstract class içerisinde yer alan abstract methodun herhangi bir method gövdesi yoktur. Bu tarz methodlar sadece bir kalıp niteliğindedir ve implementasyonları türeyen sınıfların içerisinde yapılmalıdır. (polymorphism)

   Madde 4 

Madde 5,6,7 ise yukarıdaki açıklamalar içerisinde örneklendirildi.

Abstract Class kullanımı yazılım geliştirme “best practice”i olarak  geçen DRY (Don’t Repeat Yourself) yaklaşımına uygundur.  En genel anlamda  amaç, benzer işleri yapan sınıflara default özellikler katmaktır.

Gayri resmi mecralarda (stackoverflow) virtual method’lar ile kullanılan abstract sınıfların daha iyi performans verdiği söylenmekte.

Performance, notes. In my testing, abstract classes with virtual methods have better performance than interface implementation in the .NET Framework 4.0.

Son Tahlil

Bu yazıda abstract class kurallarını izah etmeye çalıştım. Object orient programming’in temel yapı taşları olan inheritance, polymorphism gibi kavramlar ile iç içe geçmiş olan “abstract” kavramı, “clean code” hedefini koymuş güzide yazılımcıların da bir nevi “jon snow“u. Vuruyorsun vuruyorsun ölmüyor öyle de dayanıklı bir yöntem. “Eyyam-i hüceste-i bahar gelmiş leblerin bahçe-i gül, Ne müşkil derd imiş ışkun ki dermân eylemek olmaz” diyip “abstract class” bilmeyen developer’lara son bir serzenişte bulunayım. Bir takım temel kavramları farkında olmadan  kullanıyor bile olsak, günün birinde bir sohbette  “tamam anlat bakalım” dediğinde “apışmamak” adına bu kavramları arası sıra hatırlamak, sözle ifade edebilmek gerekir. İnterface ile sık sık karışan bir konu olduğu da vurgulanmalı. (Ben karıştırdım ordan biliyorum)  Açıkçası .net stack’ine bakıldığında genellikle Generic interface, interface gibi implementasyonlara daha sık rastlanılıyor gibi. Ancak yine de bu konuya hakim olmak ve gerektiği yerlerde uygulamak da elzem. Umarım faydalı bir yazı olmuştur.

2 Replies to “OOP concept : Abstract class”

  1. İnsanoğlu, unutmaya meyillidir. Arada bir hatırla(t)mak lazım. Faydalı bir makale olmuş. Emeğinize sağlık.

Leave a Reply

Your email address will not be published. Required fields are marked *