Abstract vs Interface
🎎

Abstract vs Interface

İlk bakışta yazdığımız koda oldukça benzer yetenekler kazandırdıkları görünse de aralarındaki farkların üzerinde durarak hangi senaryolarda hangisine karar vermemiz gerektiğini iyice açığa çıkartacağız.
 
Öncelikle Soyutlama yani Abstraction ne demek bunu bir irdeleyelim.
C#’ta ki soyutlama; diğer Object Oriented dillerde olduğu gibi iç detayları gizleyerek sadece işlevleri göstermeye denir.
 
Senaryo:
Çarpışan arabamızdaki soyutlamaya bakalım. Siz arabayı kullanırken direksiyonu gitmek istediğiniz yöne çeviriyor, gaz pedalına basarak ilerliyorsunuz.
Gaz pedalına bastığınızdaki motorda oluşan tetiklenmeleri, direksiyonu çevirdiğinizde lastiklerin dönmesini sağlayan mekanizmayı hiç düşünmeden yalnızca iki pedal ve bir direksiyon ile aslında arka planında onlarca aksiyondan oluşan bir işlevi gerçekleştirmiş oluyorsunuz.
Input → Gaz/fren pedalları, direksiyon
Output → Arabanın gitmesi

Abstract Class

Abstract sınıflar sınıf hiyerarşisinde genellikle base sınıf tanımlamak için kullanılan ve soyutlama yeteneği kazandıran sınıflardır.
Bir sınıfı abstract yapmak için abstract anahtarını kullanırız. Abstract sınıflar en az bir tane abstract metot bulundurması bir best practice’tir.
abstract class Yazdir { public abstract void KonsolaYazdir(); }
 
Genel olarak abstract sınıflarının özelliklerini toparlayacak olursak;
  • Genel olarak kalıtım uygularken kullanırız.
  • new anahtarıyla oluşturulamazlar.
  • İçerisinde değişken ve metot bulundurabilirler.
  • Türetilen sınıfların abstract metotları implemente etmesi zorunludur. Diğer metotlar override etmeden de kullanılabilir.
  • Constructors (yapıcı) ve destructors (yıkıcı) metotlar bulundurabilirler.
  • Static tanımlanamazlar.
  • Bir sınıf yalnızca bir abstract sınıftan kalıtım alabilir. Çoklu kalıtım desteklenmez.
  • Abstract olmayan metotlar barındırabilirler.
  • Kendisinden miras alacak sınıflar ile arasında “is-a” ilişkisi vardır.
 
💡
Çarpışan araba is-a araba. (Çarpışan araba da bir arabadır / TANIM)
 

Interface

Interface, içerisinde sadece kendisinden türeyecek olan sınıfların içini dolduracağı metot tanımlarının bulunduğu ve soyutlama yapmamıza olanak sağlayan bir yapıdır.
Tanımladığımız yapının interface olduğunu belirtmek için isminin önüne I harfini getirmek bir best-practice olacaktır.
interface ILog { void Logla(string kayit); }
 
Genel olarak interface'lerin özelliklerini toparlayacak olursak;
  • new anahtarı ile oluşturulamazlar.
  • Bir sınıfın ne yapması gerektiğini belirtir, nasıl yapması gerektiğini değil.
  • Default olarak tüm Interface üyeleri abstract ve public olarak tanımlanır. Sizin özellikle belirtmeniz gerekmez.
  • Bir sınıf birden çok interface'i inherit edebilir. Çoklu kalıtım desteklenir.
  • İçerisinde sadece metotların imzaları yer alır, içi dolu metot bulunduramazlar.
  • Kendisinden kalıtım alacak sınıflar ile arasında “can-do” ilişkisi vardır.
 
💡
Çarpışan araba can-do hızlanır (Çarpışan araba hızlanabilir / DAVRANIŞ)
 
İnterface'lerin tam olarak can-do ilişkileri içeren yapılarda kullanmamız isabetli olacaktır. Senaryomuzdaki çarpışan araba hızlanabilir. Bu çarpışan arabanın yapabileceği bir kabiliyeti göstermektedir. Can-do ilişkisi davranışları, kabiliyetleri belirtir. Bu kabiliyetin interface içerisinde tanımlanması çok daha doğru olacaktır.
 

Abstract Sınıf

  • Constructor içerebilir.
  • Static üyeler içerebilir.
  • Farklı tiplerde erişim belirleyicisi içerebilir. public, private, protected gibi.
  • Sınıfın ait olduğu kimliği belirtmek için kullanılır. (is-a ilişkisi)
  • Bir sınıf sadece bir tane abstract sınıfı inherit edebilir.
  • Abstract sınıf metot, fields, constants (sabitler) vb. üyeleri içerebilir.
  • Türetilen sınıflar abstract sınıfı tamamen veya kısmi implemente edebilir.
  • Eğer birçok sınıf aynı türden ve ortak davranışlar sergiliyorsa abstract sınıfı base class olarak kullanmak doğru olacaktır.
 
 

Interface

  • Constructor içeremez.
  • Static üyeler içeremez.
  • Farklı tiplerde erişim belirleyici içeremez. Her metot public kabul edilir.
  • Sınıfın yapabileceği kabiliyetleri belirtmek için kullanılır. (can-do ilişkisi)
  • Bir sınıf birden fazla interface’i inherit edebilir.
  • Interface yalnızca metot imzalarını içerebilir.
  • Türetilen sınıflar interface’i tamamen implemente etmek zorundadır.
  • Eğer birçok sınıf yalnızca ortak metotları kullanıyor ise interface’ten türetilmeleri doğru olacaktır.
 
 
badge