Merhaba, C# Polymorphism Kavramı ve Kullanımı – OOP C# eğitim setime devam ediyorum. Bu dersimizde OOP konusunun alt başlıklarından biri olan C# Polymorphism Kavramı konusunu anlatmaya çalışacağım. Burada önceki derslerimiz olan C# Inheritance – C# Miras Kavramı ve C# Interface Kavramı ve Kullanımı derslerindeki konuları da göreceğiz. Ve yine bu derste de, önceki derslerimizde kullandığımız proje üzerinden devam edeceğiz. C# Polymorphism Kavramı, Object Oriented Programming (OOP) (Nesne Yönelimli Programlama) konusunun 4 temel prensibinden birisidir.
Yukarıdaki verdiğim derslere göz atmadan bu dersi incelerseniz anlamsız gelen yerler olabilir. Bu sebeple öncelikle yukarıdaki dersleri izlemenizi tavsiye ederim.
OOP Nedir?
Object Oriented Programming (OOP), Nesne Yönelimli Programlama (NYP) nedir sorusunda ne kısa cevap, gerçek hayattaki her şeyin bilgisayar ortamında tanımlanması olarak cevap verebiliriz. Örneğin, Motorlu araçların ortak özelliklerini bir sınıfta tanımladık. Motorlu araçlar sınıfında, havada, denizde ve karada giden motorlu araçlar sınıflarını tanımladık. Karada giden araçlar sınıfında Otomobilleri tanımladık. Otomobiller sınıfında X bir markayı tanımladık. Her sınıf bir üst kategorisinin sınıfından miras alır. Böylece XX Markası dediğimizde o sınıfın, karada giden motorlu bir taşıt olduğunu biliriz. İşte tüm bu yapıya OOP Türkçe ifadesi ile NYP deriz.
Daha detaylı bilgi için bkz Wikipedia.
C# Polymorphism Kavramı ve Kullanımı – OOP
C# Polymorphism Nedir?
C# Polymorphism‘in Tükçe karşılığı Çokbiçimlilik anlamına gelir.
Tanım 1: Taban sınıfının, belli bir metodunun türemiş sınıflarda, o sınıflarda değişik bir biçimde çalıştırılmasıdır.
Tanım 2: Temel sınıftan türetilmiş sınıfa, kalıtım(Inheritance, miras) yolu ile aktarılan fakat türetilmiş sınıfta farklı kullanılabilmesine izin verilen sınıf üyesidir.
Basitleştirecek olursak, oluşturduğumuz ve diğer sınıflara miras olarak eklediğimiz sınıflardaki metotların, türettiğimiz sınıflara özel orjinalinden farklı işlemler için kullanabildiğimiz metotlardır.
Anlaması biraz zor olabilir ama uygulama üzerinde daha net anlaşılacaktır. O yüzden uygulamamıza geçelim.
Şimdi projemizde Polymorphism adında bir klasör tanımladık ve içerine 4 tane sınıf tanımladık. Bunlar MyShape, MySquare, MyRectangle, MyCircle sınıflarıdır. MySquare, MyRectangle, MyCircle sınıfları, MyShape sınıfından miras almaktadır. Aynı zamanda MyShape taban/ temel sınıfımıza, Interface klasörümüzde yer alan MyShapeWorks ınterface uygulanmıştır.
MyShape.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace C_sharp_Inheritance.Polymorphism { class MyShape : Interface.MyShapeWorks { public virtual object Draw() { return ""; } public object Delete() { return this.GetType().Name + " Deleted"; } public object Save() { return this.GetType().Name + " Saved"; } public object Update() { return this.GetType().Name + " Updated"; } } }
Bu temel/taban sınıfımızın Polymorphism olarak görülmesini sağlayan tek bir ifade vardır. O ifade de Virtual ifadesidir Draw() metodumuz burada Virtual metottur. Virtual olarak ifade edilen bir metot olmadığında Polymorphism hakkında konuşulamaz.
Burada, MyShapeWorks adlı Interface ‘i içeriisnde 3 tane metot yer almaktadır. Bu metotları, Polymorphism ile kullanacağımız diğer türetilmiş sınıflarımız ile birlikte kullanacağız.
MyShapeWorks.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace C_sharp_Inheritance.Interface { interface MyShapeWorks { object Save(); object Update(); object Delete(); } }
Temel/Taban sınıftan türetilen sınıflar, temel/taban sınıfta var olan Virtual metodu override ederek kendi sınıfına özel işlem yaptırabilir. Aşağıdaki sınıflarda bu durumu görebilirsiniz. Temel/Taban sınıfımızda ki Draw() metodu geriye boş bir string döndürüyor ama aşağıdaki sınıfları incelerseniz her biri farklı bir string ifade döndürüyor. İşte bu duruma Polymorphism diyoruz.
Şimdi diğer sınıflarımızı görelim.
MyCircle.cs
MyCircle sınıfı, MyShape’den miras alıyor. Burada Interface, temel/taban sınıfa uygulanmış olsa da, kendisinden türetilen sınıflara bir zorunluluğu yoktur.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace C_sharp_Inheritance.Polymorphism { class MyCircle : MyShape { public override object Draw() { return "Drawed Circle"; } } }
MyRectangle.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace C_sharp_Inheritance.Polymorphism { class MyRectangle : MyShape { public override object Draw() { return "Drawed Rectangle"; } } }
MySquare.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace C_sharp_Inheritance.Polymorphism { class MySquare : MyShape { public override object Draw() { return "Drawed Square"; } } }
Şimdi projemizdeki TabControl’e bir tab daha ekledik ve adını Polymorphism / Interface yaptık. Form tasarımı aşağıdaki gibidir.
Button nesnelerine her tıkladığımızda listbox nesnesine dört satır ekleyecek.
Circle Button Click eventindeki kodlara bir bakalım.
private void btn_circle_Click(object sender, EventArgs e) { // Polymorphism Polymorphism.MyShape c = new Polymorphism.MyCircle(); // MyCircle gibi davranan MyShape... listBox1.Items.Add(c.Draw());// Çalışan bu metot, MyShape sınıfında tanımlanan, MyCircle sınıfında override edilen metottur. // Polymorphism // Interface listBox1.Items.Add(c.Save()); listBox1.Items.Add(c.Update()); listBox1.Items.Add(c.Delete()); // Interface }
Kodları açıklamamız gerekirse;
- Polymorphism kısmında gördüğünüz gibi MySpahe sınıfından bir MyCircle nesnesi türetiyoruz. Bunu yapabilmemizin sebebi MyCircle sınıfının MyShape sınıfından türetilmesidir.
- Listbox1 nesnesine eklediğimiz satır, MyShape sınıfında virtual olarak tanımlanan ve MyCircle sınıfında override edilen metottur.
- Şimdi burada Buttona tıkladığımızda listbox’a eklenecek olan bilgi MyShape sınıfındaki boş string ifadesi değil, MyCircle sınıfındaki “Drawed Circle” ifadesidir.
- Interface kısmıan geldiğimizde, buradaki 3 metot MyShapeWorks Interface içinde tanımlanan ve MyShape sınıfında uygulanan arayüzden gelir.
- Burada, MyCircle nesnesini MyShape üzerinden türettiğimizi için, MyShape sınıfına uygulanan arayüzden gelen metotları da kullanabiliyoruz.
Şimdi projemizi çalıştıralım ve Circle button nesnesine tıklanıldığında Listbox nesnesine eklenen verileri görelim.
Gördüğünüz gibi button nesnesine tıkladığımızda listbox nesnesine dört satır veri eklendi.
“Drawed Circle” ifadesi, MyShape sınıfında yer alan ve override edilen Draw metodundan geliyor. Diğer üç satır ise MyShape sınıfına uygulanan arayüzden gelen metotlardan geliyor.
Rectangle ve Square button nesnelerin click eventlerine de bakalım.
private void btn_Square_Click(object sender, EventArgs e) { // Polymorphism Polymorphism.MyShape s = new Polymorphism.MySquare(); // MySquare gibi davranan MyShape... listBox1.Items.Add(s.Draw()); // Çalışan bu metot, MyShape sınıfında tanımlanan, MySquare sınıfında override edilen metottur. // Polymorphism // Interface listBox1.Items.Add(s.Save()); listBox1.Items.Add(s.Update()); listBox1.Items.Add(s.Delete()); // Bu metotlar, MyShape sınıfına uygulanan MyShapeWorks Interface 'den gelen metotlardır. // Interface, MyShape sınıfında değilde MySquare sınıfında uygulanmış olsaydı bu şekilde kullanım yapamazdık.. // MySquare, MyShape sınıfından miras alıyor. MySquare sınıfını, MyShape sınıfı üzerinden Polymorphism ile kullandığımız için // MyShape sınıfına uygulanan Interface metotlarına erişebiliyoruz // Interface } private void btn_Rectangle_Click(object sender, EventArgs e) { // Polymorphism Polymorphism.MyShape r = new Polymorphism.MyRectangle(); // MyRectangle gibi davranan MyShape... listBox1.Items.Add(r.Draw()); // Çalışan bu metot, MyShape sınıfında tanımlanan, MyRectangle sınıfında override edilen metottur. // Polymorphism // Interface listBox1.Items.Add(r.Save()); listBox1.Items.Add(r.Update()); listBox1.Items.Add(r.Delete()); // Interface }
Gördüğünüz gibi Circle, Rectangle ve Square nesneleri MyShape sınıfı üzerinden türetildi. Bu demek oluyor ki MyShape sınıfı burada çok biçimli kullanılmıştır. Diğer sınıflar kendisinden miras aldığı için kendisine uygulanan arayüzden gelen metotları kullanabiliyor.
MyCircle, MyRectangle ve MySquare sınıflarına bakarsanız, o sınıflarda sadece override edilen Draw() metotları yer almaktadır. Ancak biz MyShape sınıfına uyguladığımız arayüzden gelen metodları da diğer üç sınıf için kullanabiliyoruz.
Arkadaşlar bu OOP konusu bittiğinde tüm bu konuları içeren bir proje hazırlamayı düşünüyorum. C# Eğitim Seti sayfasındaki OOP başlığı altında yer alan tüm dersleri içeren tek bir proje hazırladığımda hem burada dersini yazacağım hemde tabi ki github üzerinden paylaşacağım.
C# Polymorphism Kavramı ve Kullanımı – OOP yazımda bu kadar arkadaşlar. Umarım C# Polymorphism Kavramı ve Kullanımı konusu güzelce açıklayabilmişimdir.
Bana destek olmak isterseniz, iletişim sayfamda verdiğim sosyal medya hesaplarımı takip edebilirsiniz.
C Sharp Eğitim Seti eğitimi sayfasına gitmek için tıklayınız. Derslerime özel olarak hazırladığım Github Projeme bu bağlantıdan ulaşabilirsiniz… Bu ders için hazırlanan projenin kodlarına buraya tıklayarak ulaşabilirsiniz.
Bu yazı, sitemdeki 431. yazıdır…
Sağlıcakla ve takipte kalın. ;)