**Soru:** Java veya C# yazıyorum ve interface vs abstract class arasında karar veremiyorum. Karar kriteri ne olmalı? **Kısa Cevap:** Interface, "ne yapabileceğini" tanımlar; abstract class "ne olduğunu" tanımlar. Birden fazla kaynaktan davranış miras alınacaksa interface, ortak kod paylaşılacaksa abstract class kullanılır. --- Interface vs abstract class sorusu nesne yönelimli programlamanın temel tasarım kararlarından biridir. **Interface: "Yapabilirlik" sözleşmesi** Interface, sınıfların dışarıya hangi işlemleri sunacağını garanti altına alır. Bunu imzalamak gibi düşün: "Beni kullanan her sınıf şu metotları sağlamak zorundadır." C# örneği: ```csharp interface IExportable { byte[] Export(); string GetFormat(); } ``` Bu interface'i hem `PdfDocument` hem de `ExcelDocument` uygulayabilir; ikisinin hiçbir ortak atası yoktur ama her ikisi de dışa aktarılabilirdir. Interface vs abstract class kararında interface'i seç: - Birden fazla kaynaktan "davranış" eklemek istiyorsanız (çoklu kalıtım) - İlişkisiz sınıflar ortak bir sözleşme paylaşacaksa - Uygulamayı tamamen dışarıya bırakacaksan **Abstract class: Ortak gövde paylaşımı** Abstract class, ortak özellik ve metodları barındırırken bazılarını alt sınıflara bırakır. ```csharp abstract class Shape { public string Color { get; set; } public abstract double Area(); // Alt sınıf implement eder public void Draw() { // Ortak implementasyon Console.WriteLine($"Çiziliyor: {Color}"); } } ``` Abstract class seç: - Alt sınıflar ortak durum (state/field) paylaşacaksa - Bazı metodların varsayılan implementasyonu varsa - "Bu sınıf bir ... türüdür" ilişkisi net olduğunda **Pratik karar ağacı** 1. Ortak kod paylaşımı gerekiyor mu? → Evet → abstract class düşün 2. Çoklu kalıtım gerekiyor mu? → Evet → interface 3. "Is-a" ilişkisi mi? (Kedi bir Hayvandır) → abstract class 4. "Can-do" ilişkisi mi? (Kedi uçabilir mi?) → interface Modern diller (Java 8+, C# 8+) interface'lere default implementasyon ekledi; bu da sınırı bir miktar belirsizleştirdi. Ama genel kural hâlâ geçerli: interface sözleşme, abstract class paylaşımlı temel.