C# – Bir Erişim Belirleyicisi Paradoksu
Bir bot üzerinde çalışırken teknik bir hatayla karşılaştım.Yaklaşık 30 – 45 dk boyunca bu hata üzerine yoğunlaştım.Onu denedim, bunu denedim.. Yok! Bütün OOP bilgilerimi gözden geçirdim.Kalıtımsal durumların hepsini inceledim.. Derken bu hatanın en son teknik çözümünü buldum.Lakin benim yazılım alanındaki temel felsefe prensiplerimden birisi “Yazılımda, Teorik Bilgi Pratik Bilgiyi Destekler” olduğu için bizler için önem arz eden bu hatanın teorik sebebiyle beraber teknik çözümünü sizlere izah edeceğim.
Öncelikle bu hata hangi durumda karşımıza çıkmaktadır bir bakalım.
Örneğin “ModelA” ve “ModelB” isimli iki sınıfımız olsun.
--- ModelA.cs ---
class ModelA
{
public int Field { get; set; }
}
--- ModelB.cs ---
public class ModelB
{
public ModelB(ModelA ModelA)
{
}
}
Gördüğünüz gibi “ModelA” sınıfımız içerisinde örnek bir “Field” isimli propert bulunmaktadır.Tabi bu propertynin konumuzda hiç bir espirisi yok.Sadece bir örnek.”ModelB” sınıfında ise bir Constructor mevcuttur ve “ModelA” tipinden bir parametre almaktadır.İşte burada bu Constructor’a yazının ilerilerinde dikkatinizi çekmek istiyorum.
Oppss…Oda ne..Projemizde ki “ModelA” ve “ModelB” sınıfları bu şekilde olunca aşağıdaki gibi bir hata vermektedir.
Hatanın metinsel şeklide aşağıdaki gibidir.
“Inconsistent accessibility: parameter type ‘WindowsFormsApplication7.ModelA’ is less accessible than method ‘WindowsFormsApplication7.ModelB.ModelB(WindowsFormsApplication7.ModelA)’”
İşte hatamız budur.
Şimdi gelin bu hatanın çözümünü neymiş görelim.Tabi öncelikle burada yapmamız gereken ilk iş hatayı aldığımız ilgili iki sınıfı incelemek olmalıdır.
Şimdi bu yazının başlarına geri dönün ve orada yazılı iki sınıfı daha dikkatli inceleyin.
“ModelA” sınıfının erişim belirleyicisi “private” iken “ModelB” sınıfının erişim belirleyicisi “public” olduğuna dikkat edin.”ModelB” sınıfı “public” olduğu için farklı projelerde bu projeyi .dll olarak yüklersek doğal olarak bu sınıfa erişim sağlanabilmektedir.Lakin “ModelA” sınıfı “private” olduğu için sadece bu projeye özel kullanılabilmekte, başka projelerde kullanılamamaktadır.Böyle bir durumda “ModelB” nesnesinin Constructor’ında “ModelA” nesnesi istenmektedir.Derleyicinin bu hatayı vermesinin sebebi, başka bir projede bu projenin .dll dosyasının kullanıldığını varsayarsak “ModelB” nesnesi oluşturulurken Constructor’ı sayesinde dışarı erişimi olmayan bir sınıfı istenecek ve böyle paradoksa sebep vermiş olacağız.Yani “ModelB” nesnesi oluşturabilmek için “ModelA” nesnesine ihtiyaç vardır ama “ModelA” ya erişim olmadığından dolayı çıkmaz bir sorunla karşı karşıya kalacağız.O yüzden böyle bir kullanım tarzı .NET mimarisi tarafından yasaklanmıştır.
Olayı teorik olarak çözdüğümüze inanmaktayım. 🙂 Şimdi gelelim teknik olarak bu sorundan nasıl kurtulacağımıza.
Aslında teorik olarak olay anlaşıldığı zaman, kullandığınız programlama dilinin yapılarına hakimseniz o işi teknik olarak çözmek artık çocuk oyuncağıdır.
Madem ki, “ModelA” sınıfı “private” olduğu için bu hatayı alıyoruz tek yapacağımız işlem bu sınıfı “public” yapmak olacaktır.
public class ModelA
{
public int Field { get; set; }
}
Artık bu hatadan teknik olarakta rahat bir şekilde kurtulmuş bulunmaktasınız.
Son kez unutmayın ki; metod, property ya da (özellikle)sınıflarınızda erişim belirleyicilerinizi programın geleceğini düşünerek vermeniz kompleks hatalardan kaçınmanıza sebebiyet verecektir.
Yazımı burada sonlandırırken bir sonraki sayfada verilen bir sınıf örneğide bu tarz bir hataya örnek olarak nitelendirilebilir ve aynı mantıkla yorumlanıp, aynı teknikle çözüm getirilebilir…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…


Çok güzel bir anlatımla açıklamışsınız. Teşekkür ederim.
Rica ederim Kaan Bey.
Sevgiler…
constructor’a da bi access modifier işi çözer 😉
Paşam olay sınıfların erişimleriyle alakalı… Nesnelerin yahut sınıf içi diğer yapıların değil 😉
Bu şimdi paradoks mu?
x y’yi gerektiriyorsa ve y dışarı açılmıyorsa, x y dışarı açılmadığı sürece gerçekleşmeyecek demektir. Bu kısır döngüye ben paradoks diyorken, sen Abdurrezzak’ta diyebilirsin…
Velhasıl…
Zamanında böyle demişim… Var mı başlık tavsiyen?
teşekkür ederim kafayı yemekten kurtardın beni