Polymorphism
Polymorphism(Çokbiçimlilik)
Polymorphism Nedir?
Polymorphism, “Çokbiçimlilik” anlamına gelen Yunanca bir kelimedir. Başka bir deyişle, bir nesnenin birçok işlevi vardır, veya birden çok işlevi olan bir adı vardır. “Poli” çok, “morph” ise form anlamına gelir.
Polimorfizm, bir sınıfa aynı isimde çoklu uygulamalar yapabilme özelliği sağlar. Kapsülleme ve kalıtım sonrası Nesneye Yönelik Programlamanın temel ilkelerinden biridir.
C# da iki tip polimorphism vardır.
- Static or Compile Time Polymorphism
- Dynamic / Runtime Polymorphism
Static or Compile Time Polymorphism
(Statik veya Derleme Zamanı Çokbiçimlilik)
Early Binding(erken bağlanma) olarak da bilinir.Metot aşırı yükleme(overloading), bir Statik Polimorfizm örneğidir. Overloading(aşırı yüklenme), aynı isme sahip metot veya fonksiyonun farklı imzalar(parametreler) alacak şekilde tanımlanmasıdır. Compile Time(Derleme zamanı) Polymorphism olarak da bilinir, çünkü hangi metodun veya fonksiyonun çağrılacağına derleme zamanında karar verilir.
C # derleyicisi, gönderilen parametrelerin sayısını ve parametre türünü kontrol eder ve hangi metodun veya fonksiyonun çağrılacağına karar verir ve eşleşen bir metot veya fonksiyon bulunmazsa hata verir.
Aşağıdaki örnek ile bu olayı inceleyelim.
public class OrnekSinif { public int Toplama(int a, int b, int c) { return a + b + c; } public int Toplama(int a, int b) { return a + b; } } class Program { static void Main(string[] args) { OrnekSinif YeniNesne = new OrnekSinif(); int UcSayiToplami = YeniNesne.Toplama(45, 34, 67); int ikiSayiToplami = YeniNesne.Toplama(23, 34); } }
OrnekSinif isimli sınıfta iki adet fonksiyon aynı isimde fakat farklı imzlarda(parametreler) de tanımlanmıştır(overloading).
Program sınıfında ise bu fonksiyonlar OrnekSinif sınıfından oluşturulan YeniNesne isimli nesne üzerinden çağrılmıştır. Çağrılan iki fonksiyonda da, aynı isimli olduğundan derleyici hangisinin çağrılacağına parametrelerine bakarak karar verir.
Sonuç olarak, Polymorphismi(çokbiçimlilik) bir nesnenin bir işlemi farklı şekillerde yapabileceğini gösteren bir kavramdır. Birbirine benzeyen nesneleri ortak özellikleriyle ele alabilmenizi ya da bir nesnenin aynı işi farklı şekillerde yapabilmesini sağlar.
Dynamic / Runtime Polymorphism
(Dinamik / Çalışma Zamanı Çokbiçimlilik)
Late binding(geç bağlanma) olarak da bilinir. Metot override (geçersiz kılma), dinamik polimorfizmin bir örneğidir. Burada, metot adı ve metot imzası(parametresi) faklı olabilir.
Metot overriding (geçersiz kılma) kalıtım(miras alma) alınan sınıfın içerisinde overriding işlemi yapılarak metot güncellenebilir. Metot overriding (geçersiz kılma) ile temel sınıf ve türetilmiş sınıfın aynı metot adına ve aynı özelliklere sahip olması mümkündür. Derleyici, fonksiyonu overriding(geçersiz kılmak) için kullanılan metodun farkında olmayacağından, derleyici derleme zamanında bir hata oluşturmaz. Derleyici, çalışma zamanında hangi yöntemin çağrılacağına karar verir ve hiçbir yöntem bulunmazsa hata verir.
Bir örnek üzerinden inceleyecek olursak…
Dynamic / Runtime Polymorphism Örneği
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleFirstApp1 { public class Hesaplama { public virtual double Alan() { return 0; } } public class Cember : Hesaplama { public double YariCap { get; set; } public Cember() { YariCap = 5; } public override double Alan() { return (3.14) * Math.Pow(YariCap, 2); } } public class Kare : Hesaplama { public double Uzunluk { get; set; } public Kare() { Uzunluk = 6; } public override double Alan() { return Math.Pow(Uzunluk, 2); } } public class Dikdortgen : Hesaplama { public double Yukseklik { get; set; } public double Genislik { get; set; } public Dikdortgen() { Yukseklik = 5.3; Genislik = 3.4; } public override double Alan() { return Yukseklik * Genislik; } } class Program { static void Main(string[] args) { Hesaplama cember = new Cember(); Console.WriteLine("Cember Alanı:" + cember.Alan()); Hesaplama kare = new Kare(); Console.WriteLine("Kare Alanı:" + kare.Alan()); Hesaplama dikdortgen = new Dikdortgen(); Console.WriteLine("Dikdörtgen Alanı :" + dikdortgen.Alan()); Console.ReadKey(); } } }
Hesaplama isimli base sınıfın Alan fonksiyonu daha sonra overriding(yani tekrar güncellene bilmesi) edile bilmesi için virtual olarak tanımlamıştır.
Cember sınıfında Hesaplama sınıfından kalıtım alınmış ve görüleceği üzere base Hesaplama sınıfının fonksiyonu Alan, Cember sınıfın içerisinde overriding edilmiş yani yeniden tanımlanmıştır.
Bu işlem diğer sınıflarda da aynı şekilde yapılmıştır.
Program sınıfı içerisinde her sınıftan üretilen nesneler ile sınıfların fonksiyonları çağrılmıştır.
Sonuç
Sonuç olarak yukarıda iki tipinide gösterdiğimiz polymorphism tiplerinden ilkinde; bir sınıfın metot veya fonksiyonu aynı isimde farklı parametreler alabilecek şekilde tanımlana bilir, buda bize aynı görevi yapan fonksiyonlara veya metotlara farklı isim verme işleminden kurtarır.
İkinci polymorphism tipinde bir sınıfın içerisinde virtual olarak tanımlanmış metot veya fonksiyonlar bu sınıfı kalıtım(miras) alan sınıflarda tekrardan tanımlanabilir ve içerisinde değişlik yapılabilmesi sağlamaktadır. Bu polymorphism de bize ortak özellikleri olan metotları base sınıflarda tanımlanıp ek özelliklerinin kalıtım alınan sınıflarda tanımlanmasını sağlar.
Yukarıdaki örnekte de tüm geometrik şekillerin bir alanı olduğu için base sınıfta bu metot virtual olarak tanımlanmıştır. Geometrik şekillerin her birinin alan hesabı olduğundan bu sınıftan miras alınmış fakat alan hesabı farklı olacağından bu şekillerin sınıfları içerisinde override edilerek alan hesaplama fonksiyonları güncellenmiştir.