Virtual Keyword | C#

Özge Odabaş
2 min readOct 18, 2023

virtual anahtar kelimesi metodlarla, propertylerle veya eventlerle birlikte kullanıldığında, bu yapıların türetilmiş sınıflarda override edilebilme özelliği kazanmasını sağlar.

Örneğin,

public class Log{

public virtual void log(){
//logging codes
}

}

Log sınıfından türetilmiş herhangi bir sınıf virtual olarak belirtilmiş log metodunu kendine göre override edebilir.

public class LogDatabase:Log {

public override void Log(){
//logging codes according to database
}
}


public class LogSms:Log{

public override void Log(){
//logging codes according to sms
}
}

Bir virtual metod çağrıldığında, nesnenin çalışma zamanı türü override açısından kontrol edilir. Türetilmiş sınıfın override edilmiş metodu çağrılır. Eğer türetilmiş sınıf metodu override etmediyse orijinal metod çalıştırılır.

C#’ta metodlar default olarak non-virtual’dur. Non-virtual metodları override edemeyiz.

Virtual anahtar kelimesiyle birlikte static, abstract, private ve override anahtar kelimelerini kullanamayız. Kullanmamız virtual anahtar kelimesini kullanmamızı anlamsız hale getirir.

New Keyword

virtual ve override keywordlerini nerelerde ve neden kullanacağımızı öğrendik. Bir de karşımıza new keywordü çıkıyor.

new keywordü de virtual ve override gibi metodlara, propertylere ve eventlere uygulanabilir.

Eğere türetilmiş sınıfımızadaki aynı isimli metodumuz new veya override ile belirtilmemişse compiler burada uyarı verir ve metodu new ile yazılmış gibi algılar.

New ile işaretlenmiş metod base sınıftaki metodtan bağımsız bir metod olarak algılanır.

Örneğin,

public class BaseClass {

public virtual void Method1(){}
public virtual void Method2(){}
}

gibi bir base sınıfımız bir de,

public class DerivedClass:BaseClass{
public void Method3(){}
}

gibi bir türetilmiş sınıfımız var. Burada herhangi bir sorun çıkmadan methodları kullanabiliriz. Fakat ileriki bir zamanda base sınıfa virtual bir Method3 metodu eklendiği zaman türetilmiş sınıftaki Method3 isimli metod açısından sorun çıkacaktır.

public class BaseClass {

public virtual void Method1(){}
public virtual void Method2(){}
public virtual void Method3(){}
}


public class DerivedClass:BaseClass{
public void Method3(){}
}

Bu durumda türetilmiş sınıftaki metodu override etmeli veya new keywordüyle bağımsız bir metod olarak kullanmalıyız.

public class DerivedClass:BaseClass{
public override void Method3(){}
}

//or

public class DerivedClass:BaseClass{
public new void Method3(){}
}

C# Compiler Hangi Metodu Çalıştıracağını Nasıl Seçiyor?

Peki, C# compiler aynı isimde aynı parametrelere sahip iki metoddan hangisinin çalıştırılacağını nasıl seçiyor?

Örneğin,

public class DerivedClass : BaseClass
{
public override void DoSomething(int paramater) { }
public void DoSomething(double paramater) { }
}

DoSomething metodu DerivedClass objesi üzerinden çalıştırıldığı zaman compiler ilk önce DerivedClass’ta deklare edilmiş metodu deneyecektir. Override edilmiş metod base sınıfta deklare edilmiş metodun yeni bir implementasyonu olduğu için ondan önce diğer metod denenir.

Eğer compiler metod çağrıldığında DerivedClass içerisinde deklare edilmiş bir metodla eşleştirmezse override edilmiş metod denenecektir.

Örneğin,

int value = 2;
DerivedClass d = new DerivedClass();
d.DoSomething(value); //it will call DoSomething(double parameter)

Burada compiler value değişkenini implicit olarak double’a çevirebileceğinden dolayı double parametreli olan overriden metod çalışır. Bu gibi durumlardan kaçınmak için,

  • base sınıfta virtual olarak belirlenmiş metodlarla aynı isimde metodlar kullanmamak

veya

  • metod call yaparken kullanacağımız DerivedClass objesini explicit olarak base sınıfa cast etmemiz gerekir.
((BaseClass)d).DoSomething(value); //it will call DoSomething(int)

--

--

Özge Odabaş

Merhaba! Ben Özge. Junior Java Developerım. Kendimi geliştirirken edindiğim bilgileri yazıyorum. Keyifli okumalar.