31 Mart 2015 Salı

C Sharp Polimorfizm Kullanımı

Yorum Bırak
Polimorfizm Yunanca'da birçok şekil anlamında kullanılmaktadır. Yazılım dilinde ise bir nesnenin başka bir nesneymiş gibi davranabilmesine polimorfizm deniyor. Polimorfizm başlığı altnda inceleyeceğimiz birkaç detay var.


   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()"
            }
        }
    }
Yukardaki kod bloğunu incelediğimizde Bir A classı ve bu classtan türemiş bir B classı görmekteyiz. A classı  kendi içerisinde Foo adlı bir metod içermekte ve bu metod ekrana bir yazı bastırıyor. B classı da A classından türediği için, A classı içerisinde tanımlanmış olan Foo metodunu çağırıp kullanabilir. Ekran çıktılarını kod içerisinden de görebiliriz.

Virtual and Override Keywordleri 

Ancak bazen  A classında tanımlanmış olan bu metod yetersiz kalabilir ve buna bizim ekleyeceğimiz ekstra işlemler olabilir. Bu durumda A classında tanımlanmış olan bu metodu B classında override etmek durumundayız. Aşağıdaki kodu inceleyecek olursak:

 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()"
            }
        }
     }


Burada A classındaki metodu B classında override edebilmemiz için, A classındaki metodun başına virtual keywordünü eklememiz gerekmektedir. B classında da A classında yazdığımız metodu ezmek için başına override keywordünü ekliyoruz. Sonuç olarak her class kendi instance'ı içerisinde tanımlanmış metodun içerisindeki işlemlere ait çıktıyı alacaktır.

     A a = new B();
                a.Foo();  // çıktı--> "B::Foo()"
Ancak yukarıdaki gibi A classının instanceını alırsak, çıktımız B classı içerisinde override etmiş olduğumuz metodun içerisindeki işlemler sonucu elde edilen çıktı olacaktır.

Metod Gizleme (Metod Hiding)

Eğer yukarıdaki gibi A classının instance'ını aldığımızda A classı içerisindeki Foo metodunun çalışmasını istiyorsak,  B classının içindeki Foo metodunu tanımlarken override değil new keywordünü kullanmamız gerekir. Aşağıdaki kod bloğundan bu kullanımı görebilirsiniz:




         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ı } } }
Görüldüğü üzere burada en alt kısımda aldığımız çıktı A classı içindeki metodda yazılan işlem sonucunda alınan çıktı oldu.
Polimorfizim dediğimiz de aslında ilk planda  A a = new B(); şeklinde A classının instance'ını B classı üzerinden alabilmemizdir.


0 yorum:

Yorum Gönder