C#'ta polimorfizm (çok biçimlilik), nesne yönelimli programlamanın (OOP) temel kavramlarından biridir ve bir nesnenin birden fazla biçimde davranabilmesi anlamına gelir. Başka bir deyişle, farklı sınıflara ait nesnelerin ortak bir tipteymiş gibi ele alınabilmesini sağlar.
C#'ta polimorfizm iki ana mekanizma ile gerçekleştirilir:
1. Derleme Zamanı Polimorfizmi (Statik Polimorfizm/Aşırı Yükleme - Overloading):
Bu polimorfizm türü, derleme zamanında çözümlenir. Metot aşırı yüklemesi (method overloading) ve operatör aşırı yüklemesi (operator overloading) ile elde edilir.
-
Metot Aşırı Yüklemesi: Aynı sınıf içinde aynı ada sahip ancak farklı parametre listelerine (farklı sayıda, türde veya parametrelerin sıralamasında) sahip birden fazla metot tanımlamaktır. Derleyici, metot çağrısı sırasında sağlanan argümanlara göre hangi metodun çağrılacağını belirler.
C#public class HesapMakinesi { public int Topla(int a, int b) { return a + b; } public double Topla(double a, double b) { return a + b; } public int Topla(int a, int b, int c) { return a + b + c; } } // Kullanım HesapMakinesi hesap = new HesapMakinesi(); int toplam1 = hesap.Topla(2, 3); // Topla(int, int) metodunu çağırır double toplam2 = hesap.Topla(2.5, 3.7); // Topla(double, double) metodunu çağırır int toplam3 = hesap.Topla(1, 2, 3); // Topla(int, int, int) metodunu çağırır
-
Operatör Aşırı Yüklemesi: Standart operatörlerin (örneğin +, -, *, /, ==, != vb.) özel bir sınıfın nesneleriyle kullanıldığında nasıl davranması gerektiğini tanımlamaktır.
C#public struct KarmaşıkSayı { public double Gerçek; public double Sanal; public static KarmaşıkSayı operator +(KarmaşıkSayı k1, KarmaşıkSayı k2) { return new KarmaşıkSayı { Gerçek = k1.Gerçek + k2.Gerçek, Sanal = k1.Sanal + k2.Sanal }; } } // Kullanım KarmaşıkSayı sayı1 = new KarmaşıkSayı { Gerçek = 2, Sanal = 3 }; KarmaşıkSayı sayı2 = new KarmaşıkSayı { Gerçek = 1, Sanal = 2 }; KarmaşıkSayı toplam = sayı1 + sayı2; // Aşırı yüklenmiş + operatörünü kullanır
2. Çalışma Zamanı Polimorfizmi (Dinamik Polimorfizm/Ezme - Overriding):
Bu polimorfizm türü, çalışma zamanında çözümlenir. Kalıtım (inheritance) ve sanal metotlar (virtual methods) aracılığıyla elde edilir.
-
Metot Ezme: Türetilmiş bir sınıfın, temel sınıfında zaten tanımlanmış bir metot için özel bir uygulama sağlamasıdır. Temel sınıf metodu
virtual
,abstract
veyaoverride
olarak bildirilmelidir.virtual
: Temel sınıf metodunun bir uygulaması vardır, ancak türetilmiş sınıflar bunu ezebilir.abstract
: Temel sınıf metodunun bir uygulaması yoktur (sadece bir bildirimdir) ve türetilmiş sınıflar bunu mutlaka ezmelidir. Bu, temel sınıfı soyut (abstract) yapar.override
: Türetilmiş sınıfta, temel sınıftan bir sanal veya soyut metodu ezdğini belirtmek için kullanılır.
C#public class Hayvan { public virtual void SesÇıkar() { Console.WriteLine("Genel hayvan sesi"); } } public class Köpek : Hayvan { public override void SesÇıkar() { Console.WriteLine("Hav hav!"); } } public class Kedi : Hayvan { public override void SesÇıkar() { Console.WriteLine("Miyav!"); } } // Kullanım Hayvan hayvan1 = new Hayvan(); Hayvan hayvan2 = new Köpek(); Hayvan hayvan3 = new Kedi(); hayvan1.SesÇıkar(); // Çıktı: Genel hayvan sesi hayvan2.SesÇıkar(); // Çıktı: Hav hav! hayvan3.SesÇıkar(); // Çıktı: Miyav!
Bu örnekte,
hayvan2
vehayvan3
Hayvan
olarak bildirilmiş olsa bile, gerçek nesne türüne (Köpek veya Kedi) göre çalışma zamanında doğruSesÇıkar()
metodu çağrılır. Bu, çalışma zamanı polimorfizminin gücüdür.
Polimorfizmin Temel Faydaları:
- Kod Tekrar Kullanılabilirliği: Farklı sınıfların nesneleriyle çalışan genel kod yazabilirsiniz.
- Genişletilebilirlik: Yeni sınıflar eklemek ve bunların mevcut kodla değişiklik yapmadan çalışmasını sağlamak kolaydır.
- Bakım Kolaylığı: Kodun bir bölümündeki değişikliklerin diğer bölümleri etkileme olasılığı daha düşüktür.
- Esneklik: Nesneleri daha soyut bir şekilde ele alabilir, kodunuzu farklı durumlara daha uyarlanabilir hale getirebilirsiniz.
Polimorfizm, C#'ta sağlam, esnek ve bakımı kolay nesne yönelimli kod yazmak için çok önemli bir kavramdır. Derleme zamanı ve çalışma zamanı polimorfizmi arasındaki farkı anlamak, bu güçlü özelliğin etkili kullanımı için gereklidir.
Hiç yorum yok:
Yorum Gönder