Bu yazımda C#’ta Polymorphism yani çok biçimlilik konusuna değineceğim.Anlaşılması biraz zor bir durum olsada,en uygun biçimde izah etmeye çalışacağım.OOP’de çok biçimlilik iki şekilde elde edilebilir.Kalıtım yoluyla ve interface kalıtımı yoluyla.İkisinde de amaç,bir nesnenin birden fazla türün davranışlarını gösterebilmesini sağlamaktır.
Base Class’tan bir referansa,Base Class’tan türemiş bir sınıfın nesnesini işaret ettirmektir.Yani türemiş olan bir sınıfın referansını,o sınıfın türemiş olduğu sınıfın referansına geçirebiliyoruz.Ancak bunun tersi durum mümkün değildir.Yani Base Classın referansını, ondan türeyen sınıfın referansına geçiremeyiz.Buna çok güzel bir örnek verebiliriz.
Hayvan sınıfından Kuş sınıfını türetebiliriz.Kuş sınıfının referansını,Hayvan sınıfının referansına geçirebiliriz.Çünkü her kuş bir hayvandır.Ancak tam tersi mümkün değildir.Yani her hayvan bir kuş değildir.
Şimdi Base Class olacak sınıfımızı tanımlıyorum.”A.cs”
---A.cs---
class A
{
public string B { get; set; }
public string C { get; set; }
}
Bu sınıftan türeyecek bir sınıfıda hazırlıyorum.”B.cs”
---B.cs---
class B:A
{
public string D { get; set; }
public string E { get; set; }
public string F { get; set; }
}
Gördüğünüz gibi B sınıfı A sınıfından türüyor.
Şimdi B referansını A referansına geçirelim.
//1.Şekil
A a = new A();
B b = new B();
a = b;
//2.Şekil
B b = new B();
A a = b;
//3.Şekil
A a = new B();
Yukarıda gördüğünüz gibi türemiş sınıfın referansı,türediği sınıfın referansını işaret edebiliyor.
Kalıtım veren sınıf,kendisinden kalıtım alan sınıfın memberlarından haberdar değildir.Dolayısıyla A türünden a referansı ile B sınıfına ait bir elemana ulaşamayız.Bu önemli bir noktadır.Yani, B sınıfında D isimli string bir propertymiz var.a.D diyip bu propertye erişemeyiz.
A a = new B();
a.D = "deneme";
/*A sınıfının referansı,kendisinden türeyen B sınıfının referansını işaret edebiliyor.
Ancak A sınıfı B sınıfındaki memberlardan haberdar olmadığı için,B sınıfındaki D isimli
propertye ulaşamıyor.Bu nedenden dolayı yukarıdaki kod,a referansında D elemanı bulamadığından
hata verecektir.Bu sorunu aşağıdaki şekilde çözebiliriz.*/
A a = new B();
((B)a).D="Asd";
/*Bu şekilde a referansını B sınıfına casting yaparsınız hatayla karşılaşmazsınız.
Yukarıdaki ((B)a).D Casting işlemidir.Boxing – Unboxing sadece object türlerde meydana gelir.Çok biçimlilik ilişkisi olan nesnelerde ki bu işleme casting denir.
Umarım faydalı olabilmişimdir.
İyi çalışmalar.