Nesne tabanlı programlamada sanal dediğimiz yapılanmalar mevcuttur.
Bir nesne üzerinde var olan tüm memberların tamamı derleme zamanında belirgindir. Yani, derleme aşamasında hangi nesne üzerinden hangi metotların çağırılabileceği bilinmektedir.
Sanal yapılar ile derleme zamanında kesin bilinen bu bilgi run time(çalışma zamanın)’da belirlenebilmektedir. Yani ilgili nesnenin hangi metdu kullanacağı bilgisaiyle karşılaştırılır.
Yani bir member’ın bir nesnenin içerisinde olup olmayacağını run time’da belirlemek istiyorsak bunu sanal yapılandırmalar ile sağlamaktayız.
Sanal Yapılar Nedir
Bir sınıf içerisinde bildirilmiş olan ve o sınıftan türeyen alt sınıflarda da tekrar bildirilen yapılardır. Bu yapılar metot ya da property olabilir.
Bir sınıfta bildirilen sanal yapı(metot ya da property) bu sınıftan türeyen rotunlarında ezilebilmekte yani devre dışı bırakılıp yeniden oluşturulabilmektedir.
Buraa yapılan isim gizlenmesine benzesede aslında isim gizlenmesi değildir. Tam olarak atadaki metot veya property nin herhangi bir torunda bilinçli bir şekilde değiştirilmesi ve bu değişiklikle devam etmesidir. Yani sanal yapılanmalarda Name Hiding’de olduğu gibi bir isimsel çakışmalardan ziyade üstten gelen bir yapının işlevini iptal edip yeniden yapılandırmak vardır.
Bir sanal member’ın hangi nesneden geleceği runt time’da belirlenir. Bir sanal member(methot veya property)’ın hangi türe ait olduğunun byu şekilde run time’da balirlenmesine Geç Bağlama(Late Binding) denir.

Sanal Yapılar Ne İçin Kullanılmaktadırlar.
Bir sınıft tanımlanmış olan herhangi bir member’ın kendisinden türeyen alt sınıflarda Name Hiding durmuna düşmeksizin eziliğ/yeniden yazılıp yapılandırılması için kullanılır.
Bir örnekler; Babamızdan bize geçen sinir hastalığının bizim tarafımızdan bu özelliğin ezilerek nahif-hümanist olarak bu özelliği değiştirmemiz verilebilir. Eğer bize geçen sinir hastalığı özelliği sanal olmasaydı biz onu ezip hümanist olamazdık.
Bir sanal yapı illaki kendisinden türeyen alt sınıflarda ezilmek zorunda değildir, bu bir seçenektir. Eğer bir member’ı ezmek istiyorsak o member kesinlikle sanal-virtual olmalıdır. Bir sınıf içerisinde sanal yapı oluşturmak istiyorsan virtual keyword’ü kullanılır.

Normal Property
class MyClass
{
public int MyProperty{get;set;}
}
Sanal Property
class MyClass
{
virtual public int MyProperty{get; set;}
}
Sanal Yapılar Nasıl Ezilir
Bir class’ta virtual ile işaretlenerek sanal hale getirilmiş bir member(metot ya da property), bu class’tan miras alan torunlarında ezilmek/yenilmek yazılmak istiniyorsa eğer ilgili class’ta imzası override keyword’ü işaretlenmiş bir vaziyette tekrardan aynı member oluşturulur.

Base class’da ya da atalarda virtual ile işaretlenerek sanallaştırılmış herhangi bir member torunlarda illa ki override ile ezilmek zorunda değildir. Atalarsan gelecek herhangi bir member override edilecekse kesinlikle virtual olarak gelmesi gerekir.
Override keyword’ü Abstract class’ların implemantasyonunda da kullanacağız.
virtual keyword’ü erişim belirleyicisinin solunda veya sağında olabilir.
Kullanımı
Mercedes mc = new mercedes();
mc.Info(); // Mercedes
Toyota ty = new Toyota();
ty.Info(); // Toyota
class Car
{
public virtual void Info(){
Console.WriteLine("Car");
}
}
class Mercedes:Car
{
public override void Info()
{
Console.WriteLine("Mercedes");
}
}
class Toyota:Car
{
public override void Info()
{
Console.WriteLine("Toyota");
}
}
Eğer çağrıldığı class’daki method oradaki gibi kullanılmak istenilseydi ‘base.Info()’ olarak override edilen methot’un içerisinde kullanmamız yeterli olacaktı.
class Toyota:Car
{
public override void Info()
{
base.Info();
}
}
Protecred ile işaretlenmiş herhangi bir member sade ve sadece ilgili sınıfta yahut o sınıftan kalıtım almış olan sınıfların içerisinde erişilebilir. Amma velakin nesne üzerinden erişilemez.