C#’ta Interface’ler ve Abstract Sınıflar
C# programlama dilinde, interfaceler ve abstract sınıflar, nesne yönelimli programlamanın temel yapı taşlarından ikisidir. Her ikisi de…
C#’ta Interface’ler ve Abstract Sınıflar
C# programlama dilinde, interfaceler ve abstract sınıflar, nesne yönelimli programlamanın temel yapı taşlarından ikisidir. Her ikisi de sınıflar arasında bir yapı ve tutarlılık sağlamak amacıyla kullanılır, ancak aralarında önemli farklar vardır. Bu yazıda, bu iki kavramın ne olduğunu, nasıl kullanıldığını ve aralarındaki farklarını inceleyeceğiz.
Bu konu yazılıma yeni başlayan kişiler tarafından oldukça karıştırılan bir kıyas bu yüzden ben de bu iki konunun kendi aldığım notlar doğrultusunda sizinle paylaşmak istiyorum.
Interface: Sözleşmeler ve Yetkinlikler
Interface Nedir?
Interface’ler, bir sınıfın hangi metotları ve özellikleri içermesi gerektiğini belirten bir sözleşme sunarlar. Interface, bir sınıfın ne yapabileceğini tanımlar ancak nasıl yapacağını belirtmez. Bu sayede farklı sınıflar, aynı interface’i implement ederek ortak bir yapıya sahip olabilirler.
Özellikler:
- Sözleşme Niteliği: Interfaceler, implement eden sınıfların uyması gereken bir dizi kural veya sözleşme tanımlar.
- Kod İçermezler (C# 8.0 Öncesi): C# 8.0 öncesinde, interface’ler içerisinde kod yazılamazdı; sadece metot ve özellik imzaları yer alırdı.
- Çoklu Implementasyon: Bir sınıf, birden fazla interface’i implement edebilir.
Gerçek Hayattan Bir Analogi
Bir banka hesabı açtığınızda, size sunulan sözleşmeyi düşünün. Bu sözleşme, belirli kuralları içerir:
- Hesabınızda para olmadan para çekemezsiniz.
- Hesabınızın bakiyesini eksiye düşüremezsiniz.
Bu kurallar, bankanın müşterilerinden beklentilerini tanımlar ancak bu kuralların nasıl uygulanacağına dair detay vermez. İşte interface’ler de bu şekilde çalışır; kuralları tanımlar ama implementasyon detaylarını bırakır yani teknik olarak interfacelerin içerisine iş kodları yazılmaz.
Teknik Detaylar
C# 8.0 ile Gelen Değişiklikler:
C# 8.0 ile birlikte, interface’lerin içerisine default implementation ve statik metotlar ekleme özelliği geldi. Bu, interfacelerin biraz daha esnek olmasını sağladı ancak geleneksel kullanımda, interface’ler kod içermezler.
Örnek :
public interface ILogger
{
void Log(string message);
// C# 8.0 ile gelen default implementation
void LogError(string error)
{
Log($"Error: {error}");
}
}
Abstract Sınıflar: Ortak Davranışların Temeli
Abstract Sınıf Nedir?
Abstract sınıflar, diğer sınıflar için bir temel veya şablon görevi gören sınıflardır. Hem kod içerebilirler hem de içerisinde abstract metotlar tanımlayarak alt sınıfların bu metotları implement etmesini zorunlu kılarlar.
Özellikler:
- Kod İçerebilirler: Abstract sınıflar, metot gövdeleri ve alanlar içerebilir.
- Abstract Metotlar: İçerisinde tanımlanan abstract metotlar, alt sınıflar tarafından override edilmek zorundadır.
- Constructor Sahipliği: Abstract sınıfların constructorları olabilir.
- Tek Kalıtım: Bir sınıf, sadece bir abstract sınıftan miras alabilir.
Neden Abstract Sınıflar Kullanılır?
- Ortak Davranışları Paylaşmak: Birden fazla sınıfta ortak olan metotları ve özellikleri tek bir yerde toplamak.
- Zorunlu Implementasyon Sağlamak: Belirli metotların alt sınıflar tarafından mutlaka implement edilmesini istemek.
- Kod Tekrarını Önlemek: Ortak kodları abstract sınıfta tanımlayarak, alt sınıflarda kod tekrarını önlemek.
Örnek:
public abstract class BaseDatabase
{
public void ExecuteSql(string query)
{
Console.WriteLine($"Query: {query}");
}
public abstract string GetDatabaseVersion();
}
Interface ve Abstract Sınıf Arasındaki Farklar
Bir Senaryo Üzerinden İnceleme
Senaryo: Veritabanı İşlemleri
Birden fazla veritabanı türüyle çalıştığımız bir uygulamamız olsun: SQL Server ve Oracle. Her iki veritabanı için de benzer işlemleri yapmamız gerekiyor.
Interface Kullanımı:
public interface IDatabase
{
void Connect();
void Disconnect();
void ExecuteQuery(string query);
}
Her veritabanı sınıfı, IDatabase interface’ini implement ederek kendi bağlantı ve sorgu işlemlerini tanımlar.
Abstract Sınıf Kullanımı:
public abstract class BaseDatabase : IDatabase
{
public void Connect()
{
Console.WriteLine("Connecting to database…");
}
public void Disconnect()
{
Console.WriteLine("Disconnecting from database…");
}
public abstract void ExecuteQuery(string query);
}
Bu abstract sınıf, bağlantı ve bağlantı kesme işlemlerini ortaklaştırırken, ExecuteQuery metodunun alt sınıflar tarafından implement edilmesini zorunlu kılar.
Alt Sınıflar:
public class SqlServerDatabase : BaseDatabase
{
public override void ExecuteQuery(string query)
{
// SQL Server'a özel
Console.WriteLine($"Executing SQL Server query: {query}");
}
}
public class OracleDatabase : BaseDatabase
{
public override void ExecuteQuery(string query)
{
// Oracle'a özel
Console.WriteLine($"Executing Oracle query: {query}");
}
}
Bu yapı sayesinde:
- Ortak kodlar BaseDatabase sınıfında toplandı.
- Her veritabanı türü, kendine özgü ExecuteQuery implementasyonunu sunuyor.
- Kod tekrarından kaçınıldı ve yapı daha sürdürülebilir hale geldi.
Detaylı Teknik Karşılaştırma
Constructor ve Alanlar
- Interface’ler: Constructor tanımlayamazlar ve alanlara sahip olamazlar. Bu, onların tamamen soyut ve sadece sözleşme niteliğinde olmalarını sağlar.
- Abstract Sınıflar: Constructor tanımlayabilirler ve alanlara sahip olabilirler. Bu, onlara veri saklama ve başlangıç işlemleri yapma yeteneği verir.
Örnek:
public abstract class Shape
{
protected string Name;
public Shape(string name)
{
Name = name;
}
public abstract double CalculateArea();
}
Çoklu Kalıtım ve Implementasyon
Interfaceler: Bir sınıf, birden fazla interface’i implement edebilir.
public class MultiFunctionalPrinter : IPrinter, IScanner, IFax
{
// Tüm interface metotları implement edilmeli
}
Abstract Sınıflar: Bir sınıf, sadece bir abstract sınıftan miras alabilir. Bu, C# dilinin tekli kalıtım modelinden kaynaklanır.
Zorunlu Metot Implementasyonu
- Interfaceler: Interface’i implement eden sınıf, tüm metotları ve özellikleri implement etmek zorundadır.
- Abstract Sınıflar: Sadece abstract olarak tanımlanan metotlar alt sınıflar tarafından implement edilmek zorundadır. Diğer metotlar isteğe bağlı olarak override edilebilir.
Hangi Durumda Hangisi Kullanılmalı?
Interface Kullanım Durumları
- Farklı Sınıfların Aynı Sözleşmeye Uyması Gerektiğinde: Örneğin, farklı türdeki koleksiyonların IEnumerable interface’ini implement etmesi gibi.
- Çoklu Implementasyon Gerektiğinde: Bir sınıfın birden fazla yeteneği (interface’i) implement etmesi gerekiyorsa.
- Bağımlılıkların Azaltılması İstendiğinde: Sınıflar arası bağımlılığı azaltmak ve esnekliği artırmak için interface’ler kullanılabilir.
Abstract Sınıf Kullanım Durumları
- Ortak Kodların Paylaşılması Gerektiğinde: Alt sınıflar arasında ortak kodları paylaşmak için abstract sınıflar idealdir.
- Temel Bir Sınıfın Oluşturulması Gerektiğinde: Diğer sınıflar için bir temel oluşturmak ve bazı metotların implementasyonunu zorunlu kılmak istendiğinde.
- Kalıtım Hiyerarşisinin Kurulması Gerektiğinde: Nesne yönelimli tasarımda bir kalıtım zinciri oluşturmak için abstract sınıflar kullanılır.
Sonuç
Interfaceler ve abstract sınıflar, C# ve genel olarak nesne yönelimli programlamada önemli kavramlardır. Doğru kullanıldıklarında kodunuzu daha esnek, sürdürülebilir ve anlaşılır hale getirirler.
Umarım bu inceleme, interfaceler ve abstract sınıflar konusundaki kafa karışıklıklarına yanıt olmuştur. Kendi projelerinizde bu kavramları kullanırken, burada paylaşılan bilgilerden faydalanabilirsiniz.
Kaynaklar
- Resmi Microsoft Belgeleri: Interface’ler ve Abstract Sınıflar
- Salih Cantekin: www.youtube.com/@TechBuddyTR
- Tasarım Desenleri ve Prensipleri: SOLID prensipleri, interface ve abstract sınıfların nasıl ve ne zaman kullanılacağı konusunda rehberlik eder.
메타데이터
- post_id
- ae987d6b70e7
- slug
- c-ta-interface-ler-ve-abstract-sınıflar-ae987d6b70e7
- url
- https://medium.com/@burakguven351999/c-ta-interface-ler-ve-abstract-s%C4%B1n%C4%B1flar-ae987d6b70e7
- canonical_url
- https://medium.com/@burakguven351999/c-ta-interface-ler-ve-abstract-s%C4%B1n%C4%B1flar-ae987d6b70e7
- author_url
- https://medium.com/@burakguven351999
- status
- ok
- fetched_at
- 2026-08-04 01:08:49