crazy_coder
Moderatör
- Katılım
- 20 Şub 2026
- Mesajlar
- 204
- Tepkime puanı
- 0
- Puanları
- 16
C# Polymorphism: Arayüzler ve Soyut Sınıflar ile Esnek Kodlama
Polymorphism, bir nesnenin başka bir nesne gibi davranabilme yeteneğidir. Örneğin, elimizde bir "Ödeme" metodu varsa, bu metodun hem "Kredi Kartı" hem "Nakit" hem de "Kripto" için farklı çalışmasını ama dışarıdan bakıldığında sadece "Öde" olarak görünmesini sağlar.
1. Soyut Sınıflar (Abstract Classes)
Soyut sınıflar, "yarım kalmış" sınıflardır. Kendi başlarına new anahtar kelimesi ile nesne haline getirilemezler. Amaçları, kendisinden türeyecek alt sınıflar için ortak bir şablon ve zorunlu yetenekler belirlemektir.
[]Abstract Method: Gövdesi olmayan, alt sınıflar tarafından doldurulması zorunlu olan metottur.
[]Kullanım Amacı: "Bu bir X'tir" (is-a) ilişkisi olan durumlarda kullanılır.
C#:
public abstract class Muzisyen
{
public string Ad { get; set; }
// Her müzisyen enstrüman çalar ama yöntemi farklıdır (Zorunlu)
public abstract void EnstrumanCal();
// Ortak metot (Zorunlu değil, her müzisyen aynı yapar)
public void SelamVer() => Console.WriteLine("Merhaba!");
}
public class Gitarist : Muzisyen
{
public override void EnstrumanCal() => Console.WriteLine("Gitar telleri titretiliyor...");
}
2. Arayüzler (Interfaces)
Arayüzler bir sınıf değildir; bir yetenek sözleşmesidir. Bir sınıfa "Hangi özelliklere sahip olması gerektiğini" söyler ama "Nasıl yapacağını" söylemez. C#'ta bir sınıf sadece bir sınıftan miras alabilirken, sınırsız sayıda arayüzü uygulayabilir.
[]Kural: I harfi ile başlarlar (Örn: ILogger).
[]Kullanım Amacı: "Bu işi yapabilir" (can-do) ilişkisi olan durumlarda kullanılır.
C#:
public interface IYazdirilabilir
{
void Yazdir(); // Gövdesiz metot
}
public class Belge : IYazdirilabilir
{
public void Yazdir() => Console.WriteLine("Belge yazıcıya gönderildi.");
}
public class Fotograf : IYazdirilabilir
{
public void Yazdir() => Console.WriteLine("Fotoğraf kağıda basılıyor.");
}
3. Polymorphism'in Gücü: Pratik Bir Örnek
Polymorphism sayesinde, elimizdeki nesnelerin gerçek türünü bilmeden onlara komut verebiliriz.
C#:
List<IYazdirilabilir> basilecekOgeler = new List<IYazdirilabilir>();
basilecekOgeler.Add(new Belge());
basilecekOgeler.Add(new Fotograf());
foreach (var oge in basilecekOgeler)
{
oge.Yazdir(); // Ogenin Belge mi Fotograf mı olduğunu bilmesine gerek yok!
}
Abstract Class mı, Interface mi? Hangisi?
Hangi yapıyı seçeceğiniz konusunda kararsızsanız bu tablo size rehberlik edecektir:
| Özellik | Abstract Class | Interface |
|---|---|---|
| Miras Limit | Sadece bir tane alınabilir. | Sınırsız sayıda uygulanabilir. |
| Metot Gövdesi | Hem dolu hem boş metot olabilir. | Sadece boş metot (imza) olur.* |
| Field (Değişken) | Değişken barındırabilir. | Sadece Property barındırabilir. |
| İlişki Türü | Sıkı hiyerarşi (is-a). | Gevşek yetenek bağı (can-do). |
Sonuç
Polymorphism, projenizin genişleyebilir olmasını sağlar. Bugün 2 ödeme yöntemi olan sisteminize yarın 3. bir yöntemi eklerken mevcut kodunuzu bozmanıza gerek kalmaz; tek yapmanız gereken arayüzü uygulayan yeni bir sınıf yazmaktır. İşte bu esneklik, "Clean Code" (Temiz Kod) yazmanın temelidir.