Abstract class ile Interface Arasındaki Fark Nedir?

OOP geliştirmelerimizde en sık kullanılan 2 yapının ortak bazı özelliklerinden dolayı oldukça karıştırıldıkları bazı kısımlar yer almaktadır ve ciddi bazı farklarından ikisinin ayırt edici olduğu kısımlar bulunmaktadır, bu makalede iki yapının aralarındaki farklara madde madde gözatacağız.

Abstract class ile Interface Arasındaki Fark Nedir

Yeni yeni OOP prensiplerini benimseyerek yazılım geliştiren arkadaşların sıklıkla sorularını yönelttiği durumlardan biri olan ve mülakatlarda sorular sorular arasında da yer bulan bu durum için kodumun şu kısmında acaba abstract mı kullansam daha iyi olur yoksa interface mi kullanmalıyım gibi sorular yöneltiliyor, açıkçası bu soru ihtiyaç duyulan kısma göre kullanılabilmektedir. Şimdi hangi durumda abstract class ve hangi durumda interface kullanmalıyız bakalım.

Ama öncesinde hangi farkları olduğuna adım adım bakalım, sonrasında aynı örnek senaryo üzerinden söz dizimine bakalım.

💬 Farklar

  • interface ve abstract class’lar new anahtar sözcüğü ile oluşturulamazlar.
  • Bir sınıf birden fazla interface’i kalıtım olarak alabilir ama bir sınıfa bir tane abstract class kalıtım alınabilir.
  • Interface içerisinde boş metodlar tanımlanabilir ama abstract class’larda hem boş metodlar tanımlanabilir hemde içi dolu metodlar tanımlabilir.
  • Abstract sınıflar içerisinde metod gövdeleri tanımlanıp özellik değerleri ayarlandığı için genellikle sonradan üzerine ek geliştirilmek yapmak için kullanılıır ama interface de ise body ve değer set edilemediği için tamamen interface üzerinden tüm üyeleri implemente edilerek sıfırdan geliştirmeler yapılması gereken durumlarda kullanılır.
  • Abstract class’lar içerisinde sadece abstract olarak işaretlenmiş metod ve özellikler implement edilmek zorundadır fakat interface içerisindeki tüm özellik ve metodlar implement edilmek zorundadır.
  • Bir class bir tane abstract class’ı kalıtım olarak alabilir ama bir class istenilen sayıda interface’i kalıtım olarak alabilir.
  • Interface içerisinde özellik ve metodlarda erişim belirleyiciler kullanılmaz herşey public olarak kabul edilir fakat abstract sınıflarda kullanılabilir.
  • Abstract sınıflara diğer sınıf ve interface’ler kalıtım olarak geçilebilir fakat interface’e yine farklı interface’ler haricinde herhangi bir yapı kalıtım olarak geçilemez.

Örnek

O zaman örnek bir senaryo üzerinden yukarıdaki farkları daha da netleştirelim.

Bu örnekte aynı sayıda ve isimde üyeye sahip arayüz ve abstract class oluşturulacak EmployeeAbstract ve EmployeeInterface adında sınıflar oluşturulup arayüzden ve abstract classdan miras alacak şekilde geliştirme yapılacak. O zaman hemen ilgili interface ve abstract tanımlarını yapalım böylelikle hızlıca örneğimize geçiş yapalım.

IPerson.cs

Person.cs

Not: Üstteki Person adlı abstract sınıfa IPerson adlı arayüzün geçilmesi ilgili satırdaki açıklamada yer aldığı gibi “arayüzü kalıtım olarak geçmemin bir esprisi yok dikkate almayınız sadece abstract class’a bir arayüzü kalıtım olarak geçebildiğimizi göstermek için ekledim :)” sadece arayüzlerin abstract sınıflara istenilirse miras olarak geçilebildiğini göstermek adına eklenmiştir.

abstract ve interface yapısı üzerinden aynı üyelere sahip nesnelerimiz oluşturduk ama abstract class’da dikkatinizi hemen bir konu çekmiştir GetName metodunun gövdesi yazılmış ama GetNameWithDescription() adlı metodun gövdesi yok ve abstract olarak işaretlenmiş o yüzden bu metodun gövdesinin tanım işi bu sınıfı miras alacak diğer sınıfa yüklenmiştir.

Sıradaki işlemimiz olan oluşturduğumuz arayüz ve abstract sınıftan türettiğimiz EmployeeAbstract ve EmployeeInterface tanımlarına gözatalım hızlıca.

EmployeeInterface.cs

EmployeeAbstract.cs

Elimden geldiğince kodlar arasına bazı önemli dipnotları tekrar yazdım lütfen bu dipnotları okumaya dikkat ediniz kodun ilgili kısımlarına dipnotları yazarak daha anlaşılır olmasını sağlamaya çalıştım umarım öyle de olmuştur.

O zaman hemen bu 2 farklı yapı üzerinden oluşturduğumuz Employee* nesneleri üzerinden aldığımız örnekler ve kullanımlarına ait örnek kod blokları altta yer almaktadır.

Bu makalede abstract ve interface arasındaki farklar anlatılmaya çalışılmıştır seçilen örnek ve metod adları sadece ikisi arasındaki farkları gösterebilmek için seçilmiştir.


Makalede kullanılan örneğe ve C# ile ilgili diğer tüm örneklere github hesabımdan erişebilirsiniz. Buraya tıklayıp github hesabıma erişebilirsiniz.


✍ Lütfen olumlu-olumsuz tüm görüşlerinizi bana yorum yada mail yolu ile iletmeyi ihmal etmeyin.

🔗 Sosyal medya kanallarından makaleyi paylaşarak destek olursanız çok sevinirim.

👋 Bir sonraki makalede görüşmek dileğiyle.

Bunlar da hoşunuza gidebilir...

Bir Cevap Yazın