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:
| Durum | Abstract Class | Interface |
|---|---|---|
| Ortak Fonksiyonellik | Evet (Kod yazılabilir) | Genellikle hayır (Sadece imza) |
| Erişim Belirleyiciler | public, protected, private olabilir. | Her şey varsayılan olarak public'tir. |
| Değişken Tutma | Field 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.