C# Polimorfizm (Çok Biçimlilik)

Polimorfizm, kelime anlamıyla "çok biçimlilik" demektir. Yazılımda ise bir nesnenin, türetildiği üst sınıfın (base class) bir örneği gibi davranabilmesi ve üst sınıftaki bir metodun her alt sınıfta farklı bir işlev kazanabilmesidir.

Neden İhtiyaç Duyarız?

Örneğin bir "Hayvan" sınıfınız ve "SesCikar()" metodunuz olsun. Kedi bu metodu "Miyav" olarak, Köpek ise "Hav" olarak kullanmalıdır. İşte aynı isimli metodun farklı çıktılar vermesine çok biçimlilik diyoruz.

1) Sanal Metodlar: Virtual ve Override

Bir metodun alt sınıflar tarafından değiştirilebilmesini istiyorsak üst sınıfta virtual, alt sınıfta ise bu metodu yeniden yazıyorsak override kelimesini kullanırız.

C# Polymorphism Example
// Üst Sınıf
public class GeometrikSekil {
    public virtual void Ciz() {
        Console.WriteLine("Şekil çiziliyor...");
    }
}

// Alt Sınıf 1
public class Daire : GeometrikSekil {
    public override void Ciz() {
        Console.WriteLine("Daire çiziliyor O");
    }
}

// Alt Sınıf 2
public class Kare : GeometrikSekil {
    public override void Ciz() {
        Console.WriteLine("Kare çiziliyor []");
    }
}

2) Çok Biçimliliğin Pratik Kullanımı

En büyük avantajı, farklı nesneleri tek bir çatı (üst sınıf tipi) altında toplayabilmektir.

GeometrikSekil[] sekiller = { new Daire(), new Kare(), new GeometrikSekil() };

foreach (var sekil in sekiller) {
    sekil.Ciz(); // Her nesne kendi içindeki Ciz() metodunu çalıştırır.
}
⚠️ Önemli Fark: Bir metod virtual tanımlanmazsa, alt sınıfta aynı isimle bir metod yazsanız bile (new anahtar kelimesi ile gizleseniz dahi), nesne üst sınıf tipinde çağrıldığında üst sınıftaki orijinal metod çalışır. Gerçek polimorfizm için override şarttır.

Özet

  • virtual: Üst sınıfta "bu metod ezilebilir" izni verir.
  • override: Alt sınıfta "bu metodu yeniden şekillendiriyorum" der.
  • Polimorfizm sayesinde kodunuz çok daha esnek ve genişletilebilir olur.
  • Yeni bir şekil eklendiğinde mevcut döngülerinizi bozmanıza gerek kalmaz.