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:
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.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ı } } }
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