C# Polymorphism, Method Hiding and Overriding



Polymorphism Nesneye Yönelik programlamanın önemli kavramlarından biridir. Yunanca'da "bir çok şekil" anlamına gelmektedir. Nesneye yönelik programlamada ise en genel anlamda oluşturduğumuz nesnelerin gerektiğinde başka bir nesneymiş gibi davranabilmesine polimorfizm denilmektedir.

Inherited Metod

Foo() diye bir metod A base clasında yaratılsın ve B class'ı A class'ından türetilsin bu durumda B class'ı Foo() metodunu tanımlamadığı halde base class'ında bulunduğu için bunu kullanabilir.

    using System;
    namespace Polymorphism
    {
        class A
        {
            public void Foo() { Console.WriteLine("A::Foo()"); }
        }

        class B : A {}

        class Test
        {
            static void Main(string[] args)
            {
                A a = new A();
                a.Foo();  // çıktı --> "A::Foo()"

                B b = new B();
                b.Foo();  // çıktı--> "A::Foo()"
            }
        }
    }
     
Virtual and Overridden Metodlar

B class'ımız için bu sefer A clasında tanımlanan Foo() metodu yetersiz gelsin. Bu durumda B class'ımız içinde bu Foo() metodunu override etmemiz gerekmektedir. Bunun için A (base class) içinde Foo() metodu tanımlanırken "virtual" keyword'ünün kullanılması gerekmektedir. B class'ı(derivered class) içinde Foo() metodu override edebilmemiz içinse "override" keywor'ünü kullanmamız gerekmektedir. Bu kodu yazarsak:

    using System;
    namespace Polymorphism
    {
        class A
        {
            public virtual void Foo() { Console.WriteLine("A::Foo()"); }
        }

        class B : A
        {
            public override void Foo() { Console.WriteLine("B::Foo()"); }
        }

        class Test
        {
            static void Main(string[] args)
            {
                A a;
                B b;

                a = new A();
                b = new B();
                a.Foo();  // çıktı--> "A::Foo()"
                b.Foo();  // çıktı--> "B::Foo()"

                a = new B();
                a.Foo();  // çıktı--> "B::Foo()"
            }
        }
     }
Metod Hiding

Eğer A a = new B(); şeklinde bir instance oluşturup a.Foo(); dediğimizde A(base class) içindeki Foo() metodunun çalışmasını, B(derivered class) içerisindeki Foo() metodunu saklanmasını istiyorsak B(derivered class) içerisine Foo(); metodu tanımlanırken new keywors'ü kullanılır. Örnek kodu yazarsak:

    using System;
    namespace Polymorphism
    {
        class A
        {
            public void Foo() { Console.WriteLine("A::Foo()"); }
        }

        class B : A
        {
            public new void Foo() { Console.WriteLine("B::Foo()"); }
        }

        class Test
        {
            static void Main(string[] args)
            {
                A a;
                B b;

                a = new A();
                b = new B();
                a.Foo();  // çıktı -->; "A::Foo()"
                b.Foo();  // çıktı-->; "B::Foo()"

                a = new B();
                a.Foo();  // çıktı--> "A::Foo()" base class içindeki Foo() çalıştı
            }
        }
    }  


Polimorfizm

Polimorfizm kavramının kullanımına bir örnek vericek olursak yukarıda A(base class) ve B(derivered class) tanımlamaları yaptık. B class'ı A class'ından türetildiği için B'nin bir instance'ını şu şekilde tanımlayabiliriz :

A a = new B();

bunu yapabilmemizin nedeni C# taki polimorfizm'dir. Polimorzime başka bir örnek verecek olursak:

diyelimki A class'ı türünden değer alan Foo(A a); fonksiyonumuz olsun. Bu durumda bir bu Foo() fonksiyonuna upcasting yaparak Foo(b) şeklinde compile hatası almadan b nin bir instance'ını yollayabiliriz. İşte bu şekilde nesnelerin gerektiğinde başka bir nesneymiş gibi davranabilmesine polimorfizm denilmektedir. En genel anlamıyla Polimorphism budur.

Yararlanılan Kaynaklar : akadia



2 yorum :

  1. gerçekten faydalı bir yazı olmuş emeğinize sağlık

    YanıtlaSil
  2. Güzel örneklerle açıklanmış bir konu

    YanıtlaSil