Ders-21 Polimorfizm Türleri

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.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir