C# Polymorphism (Çok Biçimlilik)

Polymorphism (Çok biçimlilik), Encapsulation (kapsülleme) ve Inheritance (Kalıtım) sonrasında nesne odaklı programlamanın üçüncü sırasında yer alır. Bu nedenle Polymorphisim anlamak için öncelikli olarak Encapsulation ve Inheritance konularına hakim olmak gerekir. Polymorphisimi oluşan bir nesne yapısına baskı yapılarak farklı bir nesneler şeklinde davranmasını sağlayan bir yapı olarak açıklayabiliriz.

Şöyle ki, bir önceki konumuz olan Inheritance (Kalıtım) başlığında, Yönetici ve Personel sınıflarını Çalışan adlı temel sınıfımızdan türetmiştik burada ki amaç ortak değer olan çalışan adı, maaşı ve numarası gibi üyeleri sürekli olarak oluşturmaktansa inheritance ile Yönetici ve Personel sınıfları içerisinde kullanmaktı. Peki sabit bir üyeyi alıp Inheritance ile diğer sınıflarımızda kullanabiliyoruz. Ama Inheritance ile aldığımız base class da bir değişiklik yapmak istersek ne yapacağız işte burada Polymorphisim devreye girer. Polymorphisim kısaca inheritance (kalıtım) ile aldığımız üyemizde kendi sınıfımızın özelliklerine göre değişiklik yapabildiğimiz sistemdir.

Örneğimize geçmeden önce aşağıda ki linki kullanarak Inheritance (Kalıtım) konusunu incelemenizi tavsiye ederim.

https://alkanfatih.com/c-inheritance-kalitim-nedir/

Örnek: Çalışan adlı bir ana sınıfımız olsun. Bu sınıf çalışan adı ve maaş bilgilerini tutsun. Birde bu sınıfımız içinde verilen değeri maaşın üstüne ekleme yaparak zam işlemini gerçekleştiren bir metodumuz olsun. Daha sonrasında çalışan sınıfımızdan katılım yapan bir yönetici sınıfımız olsun bu sınıfımız katılım ile çalışan sınıfından adı ve maaş bilgilerini alsın ayrıca kendisine ait bir departman kar bilgisi tutsun. Şimdi yönetici sınıfımız yine kalıtım yöntemiyle maaş zam işlemini gerçekleştirsin. Yalnızca burada şöyle bir değişiklik yapmak istiyorum. Yöneticilerin departman karları 50000’nin üzerindeyse ekstra zam yapsın. İşte burada kalıtım yolu ile çağrılan ZamYap metodumuza bir müdahale gerçekleştireceğiz. İşte bu işlem Polymorphismdir. Burada iki önemli kavrama değinmek istiyorum. Virtual ve Override.

Bir temel sınıf tanımlayacağı üyenin uygulanışının yani içerisinde ki kodların, kendisinden türeyen sınıflar tarafından değiştirilebilmesini istiyorsa bu üye virtual anahtar kelimesi ile işaretlenmelidir.

Üyenin yeniden kodlanması ve değişiklik yapıldığı durumda ise üyenin başına Override anahtar kelimesi getirilir.

    class Calisan
    {
        private string _calisanAd;
        private double _calisanMaas;

        public string CalisanAd
        {
            get { return _calisanAd; }
            set { _calisanAd = value; }
        }

        public double CalisanMaas
        {
            get { return _calisanMaas; }
            set { _calisanMaas = value; }
        }

        public virtual void ZamYap(double zamMiktar)
        {
            _calisanMaas += zamMiktar;
        }
    }
    class Yonetici:Calisan
    {
        private double _departmanKar;

        public double DepartmanKar
        {
            get { return _departmanKar; }
            set { _departmanKar = value; }
        }

        public override void ZamYap(double zamMiktar)
        {
            if (DepartmanKar > 50000)
            {
                zamMiktar += 2000;
            }
            base.ZamYap(zamMiktar);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Yonetici yonetici = new Yonetici();
            yonetici.CalisanAd = "Fatih Alkan";
            yonetici.CalisanMaas = 8500;
            yonetici.DepartmanKar = 53000;

            Console.WriteLine("Yönetici Adı: {0} Maaşı: {1}, Departman Karı: {2}", yonetici.CalisanAd.ToString(), yonetici.CalisanMaas.ToString(), yonetici.DepartmanKar.ToString());

            yonetici.ZamYap(1500);

            Console.WriteLine("Zamlı Maaş: {0}", yonetici.CalisanMaas);

            Console.Read();
        }
    }