C#’ta Name Hiding(İsim Saklama) Sorunsalı
Merhaba,
Geçenlerde bir okuyucumdan aldığım soru üzerine bu içeriği oluşturmaya karar verdim. Gelen soruda okuyucumuz, “new” anahtar söcüğü ile ilgili internette gördüğü herhangi bir makalede karşılaştığı farklı bir kullanımdan bahsetmektedir. Sorumuzun mahiyeti şöyledir;
“Merhaba Gençay Bey,
…
Esas soruma gelirsek eğer, şu adrese göz atarsanız eğer new anahtar sözcüğü metod oluşturulurken kullanılmıştır. Benim bildiğim C#’ta new anahtar sözcüğü sadece nesne talep etmek/üretmek için kullanılan bir keyworddür. Denediğim kadarıyla bu kullanım bir hata vermemektedir. Merak edip size sormak istediğim burada new keywordünün üstlendiği görev nedir?”
Öncelike bu soru name hiding/isim saklama ile ilgili olduğundan dolayı siz değerli okuyucularımın konu hakkında bilgisi yoksa eğer Interface’ler üzerine zamanında yazmış olduğum makalemin name hiding ile ilgili şu adresteki bölümü okumanızı ve bu makaleye öyle devam etmenizi tavsiye ederim.
Hemen arkadaşımızın makaledeki görmüş olduğu kod parçasına benzer bir yapıyı aşağıda bizde örneklendirelim.
class A { public new void X() { } }
Evet… Olayı sadeleştirirsek eğer aslında arkadaşımızın sorduğu C#’ta kalıtımsal durumlarda name hiding/isim saklama dediğimiz terime karşılık gelen olası duruma karşı derleyiciye bilgilendirme maksatlı kullanıllan “new” anahtar sözcüğünün ne yaptığıyla ilgilidir.
new keywordü bilindiği gibi her ne kadar nesne talep etmek/üretmek için kullanılsada kalıtım durumlarında name hiding/isim saklama durumlarında bu işlemin yazılım geliştirici tarafından bilinçli bir şekilde yapıldığını derleyiciye belirtme işleminide üstlenmektedir.
Daha doğrusu C#’ın günümüz versiyonları bu işleme gereksinim duymaksızın direkt olarak ilgili membera name hiding işlemini tabi tutacaktır. Keza hangi sürümü bilmiyorum ammaa bir zamanlar olası name hiding durumlarında derleyici “eğer name hiding yapacaksan ilgili elemanı new operatörüyle işaretlemelisin!” diye uyarıyordu. Okuyucumuzun vermiş olduğu adreste geçmiş yıllara ait bir içerik olduğundan dolayı yazarın verdiği kodlarda ilgili hataya karşılık dönemin gerekli önlemini almış olmasından dolayı new operatörü kullanılmıştır.
Her ne kadar olay teoride bundan ibaret olsada bir örnek üzerinde anlatım yaparak konuyu sonlandırmakta fayda var.
class A { public void X() { } } class B : A { public void X() { } }
Yukarıdaki kod bloğunu incelerseniz eğer X metodu hem A hem de B sınıflarında mevcuttur. Bir yandan B sınıfı A sınıfından kalıtım almaktadır. Eee haliyle burada bir isim saklama söz konusudur. İşte eskiden bu tarz bir durumda derleyiciye bu işlemi bilinçli yapıyorum demek için new keywordü kullanılırdı.
class A { public void X() { } } class B : A { public new void X() { } }
İşte bu şekilde. Ama görüldüğü üzere artık bu keywordü yazmamıza gerek yoktur. Haliyle yazmaya gerek kalmadıysa, new keywordünün bu özelliğinden bahsetmeyede pek gerek kalmamış demektir. O yüzden new operatörünün bu niteliği fazla bilinmemektedir.
Name hiding durumları bir tek metodlara özel olmadığından, sınıf içindeki tüm elemanlarda olabileceğinden dolayı bu işlemi metod dışında ki diğer yapılar içinde uygulayabilirsiniz.
Örneğin;
class A { public int x; public string y { get; set; } public bool z { get { return true; } set { } } } class B : A { public new int x; public new string y { get; set; } public new bool z { get { return true; } set { } } }
Sona gelirsek eğer yer yer internette yaptığınız araştırmalar neticesinde, okuduğunuz makalelerde yahut izlediğiniz görsel derslerde bir çok komutun günümüzde etkisini yitirmiş yahut niteliği unutulmuş farklı kullanım yerleriyle karşılaşabilirsiniz. Bu durum sizi eski kaynaklardan uzaklaştırmasın. Nihayetinde günümüzdeki programlama mantığının %99 eski kaynaklardakiyle aynıdır. Sadece daha gelişmiş, tökezlerden kurtulmuş ve yeniliklerle devleştirilmiş olduğundan eski kaynaklar günümüz ürün odaklı çalışmalara yeterli desteği verememektedir. Lakin benim düşüncem temel bir olayın en anlamlı ve lezzetli tarifi genellikle eski üstadların yazdıklarıdır.
O yüzden siz sorun, biz cevaplayalım ama eski kaynakların hatırasını canlı tutalım.
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…