Interface vs Abstract Class: Hangisini Ne Zaman Kullanmalısınız?

crazy_coder

Moderatör
Katılım
20 Şub 2026
Mesajlar
204
Tepkime puanı
0
Puanları
16

Interface mi, Abstract Class mı? Mimari Karar Verme Rehberi​


C# dünyasında her iki yapı da nesne şablonları oluşturmamızı sağlar. Ancak aralarındaki fark sadece teknik değil, aynı zamanda mantıksaldır. Yanlış kararı vermek, projenizin ilerleyen safhalarında "kod kilitlenmesine" neden olabilir.



1. Abstract Class: "Bu Bir ..." (Is-A İlişkisi)​


Eğer nesneleriniz arasında sıkı bir bağ ve ortak bir kimlik varsa Soyut Sınıf kullanmalısınız. Soyut sınıflar, ortak özellikleri ve metotları paylaşan bir "aile" kurar.

Ne Zaman Kullanılır?

  • []Ortak Kod Paylaşımı: Sınıflar arasında ortak olan metot gövdeleri (logic) varsa.
    []Durum (State) Yönetimi: Sınıflarınızın ortak değişkenleri (field) olması gerekiyorsa.
  • Evrimsel Gelişim: Temel sınıfa yeni bir özellik eklediğinizde, bu özelliğin tüm alt sınıflara otomatik olarak (veya varsayılan bir gövdeyle) yansımasını istiyorsanız.

C#:
public abstract class AkilliCihaz
{
public string Marka { get; set; }
public void SarjEt() => Console.WriteLine("Cihaz şarj ediliyor..."); // Ortak kod
public abstract void IsletimSistemiKur(); // Alt sınıfa zorunlu bırakılan iş
}



2. Interface: "Bu İşi Yapabilir" (Can-Do İlişkisi)​


Eğer nesneleriniz birbirinden tamamen farklı türdeyse ama ortak bir yetenek kazanmalarını istiyorsanız Arayüz kullanmalısınız. Interface, bir nesnenin ne olduğu ile değil, ne yapabildiği ile ilgilenir.

Ne Zaman Kullanılır?

  • []Çoklu Yetenek: Bir sınıfın birden fazla kaynaktan yetenek alması gerekiyorsa (C# çoklu kalıtımı desteklemez ama çoklu interface destekler).
    []Gevşek Bağlılık (Loose Coupling): Farklı sınıfların aynı arayüzü kullanarak birbirinin yerine geçebilmesini istiyorsanız.
  • Dış Bağlantılar: Loglama, ödeme sistemleri veya veritabanı işlemleri gibi farklı yapıların aynı standartta çalışması gerekiyorsa.

C#:
public interface IFlyable
{
void Fly();
}

public class Kus : IFlyable { public void Fly() => Console.WriteLine("Kuş uçuyor."); }
public class Ucaksavar : IFlyable { public void Fly() => Console.WriteLine("Drone uçuyor."); }



3. Kritik Karşılaştırma: Hangisi Sizi Kurtarır?​


Karar vermenizi kolaylaştıracak altın kurallar:

DurumAbstract ClassInterface
Ortak FonksiyonellikEvet (Kod yazılabilir)Genellikle hayır (Sadece imza)
Erişim Belirleyicilerpublic, protected, private olabilir.Her şey varsayılan olarak public'tir.
Değişken TutmaField ve Property tutabilir.Sadece Property/Event tutabilir.
Miras YapısıHiyerarşik (Baba-Oğul)Yetenek bazlı (Sertifika gibi)



4. Modern Yaklaşım: Beraber Kullanım​


Profesyonel projelerde genellikle her ikisi beraber kullanılır. Bir Interface ile genel kurallar belirlenir, bir Abstract Class ile bu kuralların bir kısmı doldurulur ve son olarak somut (concrete) sınıflar oluşturulur.

C#:
public interface IWorker { void Work(); }
public abstract class Employee : IWorker
{
public string Name { get; set; }
public abstract void Work(); // Gövdesiz bırakıp alt sınıfa zorlayabiliriz
}



Sonuç: Özet Tavsiye​



  • []Eğer bir nesnenin kimliğini tanımlıyorsanız ve ortak davranışlar varsa Abstract Class kullanın.
    []Eğer farklı türdeki nesnelere ortak bir yetenek (sözleşme) kazandırıyorsanız Interface kullanın.
  • Gelecekte nesnenize başka yetenekler de ekleyebilmek istiyorsanız (esneklik), her zaman Interface tercih edin.
 
Geri
Üst