Polimorfizm Türleri
İki türlü polimorfizm vardır.
- Statik Polimorfizm
- Dinamik Polimorfizm
Static Polimorfizm
Derleme zamanında sergilenen polimorfizm’dir. Hangi fonksiyonun çağırılacağına derleme zamanında karar verilir.
C#’da static polimorfizm deyince aklımıza Metot Overloading terimi gelmelidir.
Metot Overloading; aynı isimde birbirinden farklı imzalara sahip olan metotların tanımlanmasıdır. Ya da başka deyişle bir isme birden fazla farklı türde metot yüklemektir. Haliyle burada bir metodun birden fazla formunun olması polimorfizm’ken, bunlardan kullanılacak olnan derleme zamanında bilinmesi statik polimorfizm olarak nitelendirilir.
Dinamik Polimorfizm
Çalışma zamanında sergilenen polimorfizm’dir. Yani hangi fonksiyonun çalışacağına run time’da karar verilir.
C#2da dinamik polimorfizm deyince akla Metot Override gelmektedir.
Metot override; base class’ta virtual olarak işaretlenmiş metotların derived class’ta override edilerek ezilmesi/yeniden yazılması işlemidir. Haliyle burada aynı isimde birden fazla forma sahip fonksiyonun olması polimorfizm’ken, bunlardan hangisinin kullanılacağının çalışma zamanında bilinmesi dinamik polimorfizm olarak nitelendirilmektedir.
Polimorfizm Durumlarında Tür Dönüşümleri
Polimorfizm, OOP’de bir nesnenin kalıtımsal açıdan ataları olan referanslar tarafından işaretlenebilmesidir. Haliyle ilgili nesne, bu ataları olan referans türlerine göre dönüştürülebilmektedir. Alt türler üst türün referansını karşılayamazlar.

Nasıl ki A B ve C yi B ise C yi karşılayabiliryorsa Object sınıfıda tüm class’ların atası olduğu için her sınıfı karşılayabiliyor. Ondan dolayı object = 1 veya object = “Joe” veya herhangi bir sınıf değerini object alabiliyor.
Polimorfizm Durumlarında Türk Dönüşümleri
Polimorfizm durumlarında tür dönüşümünü gerçekleştirebilmek için Cast ya da as operatörleri kullanılmaktadır.
Cast
Üst türden alt türe kalıtımsal ileşkide dönüşüm sağlar.
A a = new C();
C c = (C)a;
Eğer ki, kalıtımsal ilişki olmayan herhangi bir türe dönüştürülmeye çalışılırsa derleyici hatası verecektir.
Yok eğer kalıtımsal ilişkide olup fiziksel nesnenin hiyerarşik altında olan bir türe dönüştürülmryr çalışıras run time hatası verecektir.
Örnek Olarak
class A { }
class B : A { }
class C : B { }
class D { }
A a = new C();
C c = (C)a;
D d = (D)a; //Derleyici hatası verecektir. Arada herhangi bir ilişki yoktur.
object o = 123;
int i = (int)o;
Bir nesneyi kendisi ve üstündekiler işaretleyebilir.
Misal; D türü A’dan kalıtım almıyorsa eğer hiyerarşide yer edinmeyeceğinden dolayı bu durumda derleyici hatası verecektir. Yok eğer kalıtımsal olarak C’nin altında A’nın torunu ise fiziksel C nesnesinin kendisinden küçük olan D referansoyla işaretlenmesi Polimorfizm mantığı gereği mümkün olmayacağı için run time hatası verecektir.
D d =(D)a
as Operatörü
Cast gibi kalıtımsal ilişki olan türler arasında referans dönüşümü yapabilmemizi sağlayan operatördür.
Dönüşüm esnasında hiyerarşik olarak tüm türlere dönüşüm sağlar. Lakin kalıtımsal ilişkide olunmayan türlerde derleyici hatası verecektir. Yada kalıtımsal ilişkide olup fiziksel nesnenin türünden daha alt hiyerarşide olan nesnelere dönüştürülmeye çalışıldığında Polimorfizm mantığı gereği ilgili referans o nesneyi karşılayamayacağından run time hatası VERMEYECEK geriye null dönecektir.
A a = new C();
C c = a as C;
D d = (D)a; //Hata
D dd = a as D //Null
as operatörü uygulamayı patlatmaz, ya null döner ya da olması gereken değerini döner.
is Operatörü
is operatörü kalıtımsal ilişkiye sahip nesnelerin Polimorfizm özelliğine nazaran fiziksel olarak hangi türde olduğunu veren bir operatördür.

Haliyle dikkat ederseniz fiziksel nesnenin kalıtım hiyerarşisine uygun olan türlerine ‘true’ olmayan türlerine ise ‘false’ sonucunu döndürmektedir. Katılımsal ilişki olmayan sınıflarla yapılacak kontrolde de beklenildiği gibi ‘false’ değeri döndürecektir.
Haliyle çok biçimcilik uygulanmıi bir nesnenin ihtiyaç doğrultusunda(uygun olan) farklı bir türe dönüştürülebilmesi için işi garantiye alabilmek adına önce is kontrolü ardından Cast ya da as operasyonu sağlaması kafidir.