Part 6 C# Sanal Yapılar (Virtual) ve Override Kullanımı

Sanal Yapılar Virtual & Override

Bir nesne üzerinde var olan tüm üyeler (members) derleme zamanında belirgindir. Yani, derleme aşamasında hangi nesne üzerinden hangi metotların çağrılabileceği bilinmektedir.

Sanal yapılar (virtual structures) ile derleme zamanında kesin olarak bilinen bu bilgi, çalışma zamanında (run time) da belirlenebilir hale gelir. Yani, ilgili nesnenin hangi metodu kullanacağını çalışma zamanında kararlaştırmak mümkündür.

Sanal yapılar nedir?

Sanal yapılar (virtual structures), bir sınıf içerisinde tanımlanmış olan ve bu sınıftan türeyen alt sınıflarda da tekrar tanımlanabilen yapılardır. Bu yapılar metot veya property olabilir. Sanal yapılar, bir sınıftaki üyelerin (members) türetilen sınıflarda yeniden yazılmasına (override) olanak tanır.

Name hiding ile karıştırmamak lazım.

Sanal yapıları (virtual structures) name hiding ile karıştırmamak gerekir. Sanal yapılar, üst sınıftaki herhangi bir özelliği (member) bilinçli olarak alt sınıflarda değiştirmek için kullanılır.

Name hiding, bir sınıftaki herhangi bir üyenin (member), türeyen alt sınıflarda yeniden tanımlanmasıyla oluşur ve bu durum isim çakışmasına (name conflict) neden olabilir. Ancak, sanal yapılarda durum farklıdır. Bir sınıfta bildirilen sanal yapı (metot veya property), bu sınıftan türeyen alt sınıflarda ezilebilir (override edilebilir), yani devre dışı bırakılıp yeniden tanımlanabilir. Sanal yapılarda, name hiding’de olduğu gibi isimsel çakışma yerine, üst sınıftan gelen bir yapının işlevi iptal edilip yeniden yapılandırılmaktadır.

Sanal yapılar gözlemleyelim

Eğer bir sınıfın içindeki üye (member) sanal olarak tanımlanmışsa (metot veya property fark etmez), bu üyenin hangi türe ait olduğunun çalışma zamanında (run time) belirlenmesine geç bağlama (late binding) denir. Geç bağlama, sanal üyelerin hangi türe ait olduğunun ve hangi metodun çağrılacağının çalışma zamanında karar verilmesini sağlar.

Bu, derleme zamanında (compile time) belirlenen bilgilerden farklı olarak, çalışma zamanında doğru metot veya property’nin çağrılmasını mümkün kılar.

Sanal yapılar ne için kullanılırlar?

Sanal yapılar, bir sınıfta tanımlanmış olan herhangi bir üyenin (member), kendisinden türeyen alt sınıflarda name hiding durumuna düşmeksizin ezilip yeniden yazılması için kullanılır. Bu, türetilmiş sınıfların, üst sınıftaki sanal üyeleri (metot veya property) geçersiz kılarak (override) kendi ihtiyaçlarına göre yeniden tanımlayabilmesini sağlar.

Peki Bu Zorunlu Mudur?

Hayır, bir sanal üye (virtual member) tanımlandı diye, mutlaka kendisinden türeyen alt sınıflarda ezilmek zorunda değildir. Ancak, eğer alt sınıflarda ezilmek istenirse, name hiding olmadan doğrudan ilgili sınıfın bir üyesi olacak şekilde çalışmasını sağlar. Bu, alt sınıfların üst sınıftan miras alınan üyeleri sorunsuz bir şekilde geçersiz kılabilmesine imkan tanır.

Bir sınıfta sanal yapı nasıl oluşturulur?

Bir sınıfta sanal yapı oluşturabilmek için, ilgili üyenin (metot veya property) imzasını virtual anahtar kelimesi ile işaretlemek yeterlidir. Sanal yapılar, genellikle public virtual şeklinde tanımlanır, ancak erişim belirleyicisi (public, protected, private) öncesinde veya sonrasında da virtual anahtar kelimesi kullanılabilir.

Bir sınıfta virtual anahtar kelimesi ile işaretlenerek sanal hale getirilmiş üye (member), bu sınıftan miras alan alt sınıflarda ezilmek isteniyorsa, ilgili alt sınıfta imzası override anahtar kelimesi ile işaretlenmiş bir şekilde aynı üye yeniden oluşturulur.

Base sınıfta veya atalarda virtual ile işaretlenerek sanallaştırılmış herhangi bir üye, türeyen alt sınıflarda illa ki override ile ezilmek zorunda değildir.

Ancak, bir alt sınıf base sınıftaki herhangi bir üyeyi override edecekse, o üyenin kesinlikle virtual olarak işaretlenmiş olması gerekir.

Virtual ile işaretlenmemiş bir üye kesinlikle override edilemez!

Override anahtar kelimesi, ileride abstract class’ların implementasyonunda da kullanılacaktır.

İkiden çok hiyerarşik kalıtım durumlarında override durumu

Bir sınıfta virtual ile işaretlenmiş herhangi bir üye, direkt olarak o sınıftan türeyen 1. dereceden sınıflarda illa ki override edilmek zorunda değildir. İhtiyaca göre, alt seviyedeki torun sınıflardan herhangi birinde override edilebilir.

Bu durum, programcılara esneklik sağlar ve sanal üyelerin, türeyen sınıfların hiyerarşisinde ihtiyaca göre farklı davranışlar sergilemesine imkan tanır.

Örnek 1:

class Memeli{
  virtual public void Konus(){
    Console.WriteLine("Ben konuşmuyorum...");
  }
}

class Maymun : Memeli{
  public override void Konus(){
    Console.WriteLine("Ben maymunum...");
  }  
}
class Inek : Memeli{
  public override void Konus(){
    Console.WriteLine("Ben İneğim...");
  }  
}

Örnek 2:




class Sekil{
 protected int _boy;
 protected int _en;
  
  public Sekil(int boy, int en){
    _boy = boy;
    _en = en;
  }
  
  virtual public int AlanHesapla(){
    return 0;
  }
  
}

class Ucgen : Sekil
{
  public Ucgen(int boy, int en): base(boy,en){
  
  }
  
  override public int AlanHesapla(){
    return _boy * _en /2;
  }

}

class Dortgen : Sekil
{
  public Dortgen(int boy, int en): base(boy,en){
  
  }
  override public int AlanHesapla(){
      return _boy * _en ;
    }

}

class Diktortgen : Sekil
{
  public Diktortgen(int boy, int en): base(boy,en){
  
  }
  override public int AlanHesapla(){
      return _boy * _en;
  }

}
}

Sanal yapılar hakkında özet

  • Sanal yapılar oop’de polimorfiz(çok biçimlilik)’i uygulayan yapılardır. (ilerde göreceğiz)
  • Sanal yapıların en önemli özelliği geç bağlam(late binding)’dir
  • Eğer bir member sanal olarak bildirilmemişse, derleyici nesnelerin tür bilgisinden faydalanarak derleme zamanında hangi nesneden ilgil member’ın çağrılacağını bilir.
  • Eğer bir member sanal olarak bildirilmişse, ilgili member’ın hangi nesne üzerinden çağrılacağı run time’da belirlenir.
  • Hangi member’ın run time’da belirlenmesine Geç Bağlama(Late Binding) denir.
  • Sanal yapı oluşturabilmek için ilgili member’ı virtual keywordü il işaretlemeliyiz.
  • Türeyen sınıflarda sanal yapıyı ezebilmek için override keywordü kullanılır.
  • Türeyen sınıflar sanal yapıları override etmek zorunda değildir.
  • Static yapılanmalar sanal olarak bildirilemezler! (İleride göreceğiz)

Yorum Yap

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir