C# polimorfizm, nesne yönelimli programlamanın (OOP) temel özelliklerinden biridir ve bir nesnenin, temel sınıfından türetilen farklı alt sınıfların davranışlarına uyum sağlayabilmesini ifade eder. Polimorfizm, aynı metot adının birden fazla türe özel olarak farklı şekillerde çalışmasını sağlar.
1. Polimorfizmin Amacı
- Esneklik: Farklı türde nesnelerin ortak bir arayüz üzerinden işlenmesini sağlar.
- Kodun Yeniden Kullanımı: Temel sınıf metotlarının, türetilen sınıflarda farklı işlevler yerine getirmesine olanak tanır.
- Anlaşılabilirlik: Kodun daha modüler ve okunabilir olmasını sağlar.
2. Polimorfizmin Türleri
a. Statik Polimorfizm (Static Polymorphism)
Statik polimorfizm, metot aşırı yükleme (method overloading) yoluyla elde edilir. Derleme sırasında hangi metotun çağrılacağı belirlenir.
b. Dinamik Polimorfizm (Dynamic Polymorphism)
Dinamik polimorfizm, metot geçersiz kılma (method overriding) yoluyla elde edilir. Çalışma zamanı sırasında hangi metotun çağrılacağı belirlenir.
3. Statik Polimorfizm: Metot Aşırı Yükleme
Aynı isimde birden fazla metot tanımlanır ancak farklı parametre listeleri kullanılır.
Örnek:
class Matematik
{
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;
}
}
class Program
{
static void Main(string[] args)
{
Matematik matematik = new Matematik();
Console.WriteLine(matematik.Topla(3, 5)); // Çıktı: 8
Console.WriteLine(matematik.Topla(3.5, 2.1)); // Çıktı: 5.6
Console.WriteLine(matematik.Topla(1, 2, 3)); // Çıktı: 6
}
}
4. Dinamik Polimorfizm: Metot Geçersiz Kılma
Dinamik polimorfizm, temel sınıfın sanal bir metodunun (virtual
) alt sınıflarda geçersiz kılınmasıyla (override
) elde edilir.
Örnek:
class Hayvan
{
public virtual void SesCikar()
{
Console.WriteLine("Hayvan bir ses çıkardı.");
}
}
class Kopek : Hayvan
{
public override void SesCikar()
{
Console.WriteLine("Köpek havladı.");
}
}
class Kedi : Hayvan
{
public override void SesCikar()
{
Console.WriteLine("Kedi miyavladı.");
}
}
class Program
{
static void Main(string[] args)
{
Hayvan hayvan;
hayvan = new Kopek();
hayvan.SesCikar(); // Çıktı: Köpek havladı.
hayvan = new Kedi();
hayvan.SesCikar(); // Çıktı: Kedi miyavladı.
}
}
5. virtual
, override
ve new
Anahtar Kelimeleri
virtual
: Temel sınıfta bir metodu türetilmiş sınıflarda geçersiz kılmak için tanımlar.override
: Türetilmiş sınıfta, temel sınıfınvirtual
metodu yerine geçen bir metot tanımlar.new
: Türetilmiş sınıfta, temel sınıf metodunu gizler ve tamamen yeni bir metot tanımlar.
Örnek: new
Kullanımı
class UstSinif
{
public void Mesaj()
{
Console.WriteLine("Üst sınıf mesajı.");
}
}
class AltSinif : UstSinif
{
public new void Mesaj()
{
Console.WriteLine("Alt sınıf mesajı.");
}
}
class Program
{
static void Main(string[] args)
{
UstSinif ust = new AltSinif();
ust.Mesaj(); // Çıktı: Üst sınıf mesajı.
}
}
6. Polimorfizm ve Koleksiyon Kullanımı
Polimorfizm sayesinde, türetilmiş sınıflar temel sınıf türünde bir koleksiyonda saklanabilir ve ortak metotlar çalıştırılabilir.
Örnek:
class Hayvan
{
public virtual void SesCikar()
{
Console.WriteLine("Hayvan bir ses çıkardı.");
}
}
class Kopek : Hayvan
{
public override void SesCikar()
{
Console.WriteLine("Köpek havladı.");
}
}
class Kedi : Hayvan
{
public override void SesCikar()
{
Console.WriteLine("Kedi miyavladı.");
}
}
class Program
{
static void Main(string[] args)
{
List<Hayvan> hayvanlar = new List<Hayvan>
{
new Kopek(),
new Kedi()
};
foreach (var hayvan in hayvanlar)
{
hayvan.SesCikar();
}
// Çıktı:
// Köpek havladı.
// Kedi miyavladı.
}
}
7. Abstract Sınıflarla Polimorfizm
Soyut (abstract) sınıflar, polimorfizmi uygulamak için güçlü bir yöntemdir. Soyut sınıflar, yalnızca türetilmiş sınıflar tarafından uygulanacak soyut metotlar tanımlar.
Örnek:
abstract class Sekil
{
public abstract void Ciz();
}
class Daire : Sekil
{
public override void Ciz()
{
Console.WriteLine("Daire çizildi.");
}
}
class Dikdortgen : Sekil
{
public override void Ciz()
{
Console.WriteLine("Dikdörtgen çizildi.");
}
}
class Program
{
static void Main(string[] args)
{
List<Sekil> sekiller = new List<Sekil>
{
new Daire(),
new Dikdortgen()
};
foreach (var sekil in sekiller)
{
sekil.Ciz();
}
// Çıktı:
// Daire çizildi.
// Dikdörtgen çizildi.
}
}