Polymorphism, kelime anlamı olarak çok biçimlilik anlamına gelir. C# gibi OOP destekleyen programlama dillerinde kalıtım yolu ile birbirinden türetilmiş sınıflarda sınıf hiyerarşisi içerisinde sınıflar, türetildikleri sınıfların özelliklerini miraz olarak alırlar. Bu durumda her sınıf, bir miktar da kalıtıldığı baz sınıfın biçiminde olur ve bu da bize iki başlık altında çok biçimliliğin avantajlarını sunar.
1 - Sınıfların, baz sınıflarının da formunda olması
2 - Birden fazla örneği olan sınıf metodlarının hiyerarşik olarak hangisinin öncelikli olduğunun belirlenmesi
Örnek 1: Araba sınıfından türettiğimiz Limuzin ve SporAraba sınıfları için aşağıdaki kullanım mümkündür.
class Araba
{
public string Marka { get; set; }
public string Model { get; set; }
public Araba(string marka, string model)
{
this.Marka = marka;
this.Model = model;
}
}
class Limuzin :Araba
{
public int KoltukSayisi { get; set; }
public Limuzin(string marka, string model, int koltuksayisi) :base(marka,model)
{
this.KoltukSayisi = koltuksayisi;
}
}
class SporAraba :Araba
{
public bool UstuAcilir { get; set; }
public SporAraba(string marka, string model, bool ustuacilir) :base(marka,model)
{
this.UstuAcilir = ustuacilir;
}
}
var araclar = new List<Araba> {
new Araba("Citroen", "C5"),
new Limuzin("Bentley", "Mulsanne", 8),
new SporAraba("BMW", "Z3", true)
};
Bu uygulamada görebileceğiniz gibi çok biçimliliğin llk özelliği, sınıflar için alt sınıflarının da kullanılabilmesidir. Araba sınıfından nesneleri saklayan araclar List'inde Araba sınıfının alt sınıfları olan Limuzin ve SporAraba sınıflarına ait nesneleri de herhangi bir hata almadan ekleyebiliyoruz.
Örnek 2: Araba üst sınıfında ve ondan türetilen alt sınıflarda aynı isimde ve imzada bir metod olması durumunda üst sınıfın metodu çalışır.
class Araba
{
public string Marka { get; set; }
public string Model { get; set; }
public Araba(string marka, string model)
{
this.Marka = marka;
this.Model = model;
}
public void Calistir()
{
System.Console.WriteLine("Araba çalıştı");
}
}
class Limuzin :Araba
{
public int KoltukSayisi { get; set; }
public Limuzin(string marka, string model, int koltuksayisi) :base(marka,model)
{
this.KoltukSayisi = koltuksayisi;
}
public void Calistir()
{
System.Console.WriteLine("Limuzin çalıştı");
}
}
class SporAraba :Araba
{
public bool UstuAcilir { get; set; }
public SporAraba(string marka, string model, bool ustuacilir) :base(marka,model)
{
this.UstuAcilir = ustuacilir;
}
public void Calistir()
{
System.Console.WriteLine("Spor araba çalıştı");
}
}
var araclar = new List<Araba> {
new Araba("Citroen", "C5"),
new Limuzin("Bentley", "Mulsanne", 8),
new SporAraba("BMW", "Z3", true)
};
foreach (var araba in araclar)
{
araba.Calistir();
}
Çıktı:
Araba çalıştı
Araba çalıştı
Araba çalıştı
Örnek 3: Override edilen virtual metodlarda alt sınıfın metodu çalışır.
class Araba
{
public string Marka { get; set; }
public string Model { get; set; }
public Araba(string marka, string model)
{
this.Marka = marka;
this.Model = model;
}
public virtual void Calistir()
{
System.Console.WriteLine("Araba çalıştı");
}
}
class Limuzin :Araba
{
public int KoltukSayisi { get; set; }
public Limuzin(string marka, string model, int koltuksayisi) :base(marka,model)
{
this.KoltukSayisi = koltuksayisi;
}
public override void Calistir()
{
System.Console.WriteLine("Limuzin çalıştı");
}
}
class SporAraba :Araba
{
public bool UstuAcilir { get; set; }
public SporAraba(string marka, string model, bool ustuacilir) :base(marka,model)
{
this.UstuAcilir = ustuacilir;
}
public override void Calistir()
{
System.Console.WriteLine("Spor araba çalıştı");
}
}
var araclar = new List<Araba> {
new Araba("Citroen", "C5"),
new Limuzin("Bentley", "Mulsanne", 8),
new SporAraba("BMW", "Z3", true)
};
foreach (var araba in araclar)
{
araba.Calistir();
}
Çıktı:
Araba çalıştı
Limuzin çalıştı
Spor araba çalıştı
Örnek 4: C# programlama dilinde virtual olmayan bir metodu override edebilmek için new anahtar sözcüğü kullanılır, bu şekilde alt sınıfın metoduna işlem önceliği tanınmış olur.
class Araba
{
public string Marka { get; set; }
public string Model { get; set; }
public Araba(string marka, string model)
{
this.Marka = marka;
this.Model = model;
}
public void Calistir()
{
System.Console.WriteLine("Araba çalıştı");
}
}
class Limuzin :Araba
{
public int KoltukSayisi { get; set; }
public Limuzin(string marka, string model, int koltuksayisi) :base(marka,model)
{
this.KoltukSayisi = koltuksayisi;
}
public new void Calistir()
{
System.Console.WriteLine("Limuzin çalıştı");
}
}
class SporAraba :Araba
{
public bool UstuAcilir { get; set; }
public SporAraba(string marka, string model, bool ustuacilir) :base(marka,model)
{
this.UstuAcilir = ustuacilir;
}
public new void Calistir()
{
System.Console.WriteLine("Spor araba çalıştı");
}
}
Araba araba = new Araba("Citroen", "C5");
araba.Calistir();
Limuzin limuzin = new Limuzin("Bentley", "Mulsanne", 8);
limuzin.Calistir();
SporAraba sporAraba = new SporAraba("BMW", "Z3", true);
sporAraba.Calistir();
Çıktı:
Araba çalıştı
Limuzin çalıştı
Spor araba çalıştı
Önceki benzer bazı diğer yazılarım için;
bkz: C# Base Nedir? Kullanımı ve Örnekleri
bkz: C# Override Nedir ve Nasıl Kullanılır?
bkz: C# Virtual Metod Nedir ve Nasıl Kullanılır?
bkz: C# ile Kalıtım Örneği (OOP)
bkz: Programlama Dillerinde Kalıtım Nedir?
bkz: Programlama dillerinde hata ayıklama (debugging) nasıl yapılır?