Oldukça bazı cevaplar zaten bu ilginç konuya eklenmiştir, ancak, bu davranışın neden olduğu için gerçek sebebi bulamadım . Bir deneyeyim:
Geri dön
80'lerde Smalltalk ve 90'ların ortasında Java arasında bir yerde nesne yönlendirme kavramı olgunlaştı. Başlangıçta sadece OO için mevcut bir kavram olarak düşünülmeyen (ilk olarak 1978'de bahsedilmiştir) bilgi gizleme, bir sınıfın tüm verileri (alanları) özel olduğu için tüm yöntemler herkese açık olduğundan Smalltalk'ta tanıtıldı. 90'larda OO'nun birçok yeni gelişimi sırasında Bertrand Meyer, OO kavramlarının çoğunu dönüm noktası Nesneye Dayalı Yazılım İnşaatı'nda (OOSC) resmileştirmeye çalıştı. , o zamandan beri OO kavramları ve dil tasarımı üzerinde (neredeyse) kesin bir referans olarak kabul edilen .
Özel görünürlük durumunda
Meyer'e göre, bir yöntem bir dizi sınıf için kullanılabilir olmalıdır (sayfa 192-193). Bu açıkça çok yüksek bir bilgi gizleme ayrıntısı verir, A ve B sınıfı ve tüm torunları için aşağıdaki özellik mevcuttur:
feature {classA, classB}
methodName
Durumunda private
kendisinden şu diyor ki: açıkça kendi sınıfına görünür olarak bir tür bildirmek olmadan, Erişemediğiniz nitelikli çağrısında özellik (yöntem / alanındaki) olduğunu. Yani x
bir değişkense x.doSomething()
izin verilmez. Tabii ki, sınıf içinde kalifiye olmayan erişime izin verilir.
Başka bir deyişle: aynı sınıfın bir örneğiyle erişime izin vermek için, söz konusu sınıfın yöntem erişimine açıkça izin vermeniz gerekir. Buna bazen özel-sınıf-sınıf-özel denir.
Programlama dillerinde örnek özel
Sınıf-özel bilgi gizleme yerine örnek-özel bilgi gizleme kullanan şu anda kullanılan en az iki dil biliyorum. Birincisi, Meyer tarafından tasarlanan ve OO'yu en uç noktalara taşıyan Eiffel. Diğeri Ruby, günümüzde çok daha yaygın bir dil. Ruby'de, "bu örneğe özel"private
anlamına gelir .
Dil tasarımı için seçenekler
Derleyici için özel örneğe izin verilmesinin zor olduğu ileri sürülmüştür. Ben öyle düşünmüyorum, çünkü yöntemlere nitelikli çağrılara izin vermek veya vermemek nispeten basit. Özel bir yöntem doSomething()
için izin verilirse vex.doSomething()
, bir dil tasarımcısı özel yöntemler ve alanlar için yalnızca örnek örneği erişilebilirliğini etkili bir şekilde tanımlamıştır.
Teknik açıdan bakıldığında, şu ya da bu şekilde bir seçim yapmak için hiçbir neden yoktur (özellikle Eiffel.NET'in bunu IL ile yapabileceğini düşündüğünüzde, çoklu miras olsa bile, bu özelliği sağlamamanın doğal bir nedeni yoktur).
Tabii ki, bu bir zevk meselesi ve diğerlerinin de belirttiği gibi, özel yöntemlerin ve alanların sınıf düzeyinde görünürlüğü özelliği olmadan bazı yöntemlerin yazılması daha zor olabilir.
C # neden yalnızca sınıf kapsüllemeye izin verir, örnek kapsüllemeye izin vermez
İnternet kapsamalarına örnek kapsülleme (bazen bir dilin sınıf düzeyinde aksine erişim düzenleyicileri tanımladığı gerçeğine atıfta bulunmak için kullanılan bir terim) bakarsanız, kavram genellikle kaşlarını çatar. Bununla birlikte, bazı modern dillerin, en azından özel erişim değiştirici için örnek kapsülleme kullandığını düşünerek, bunun modern programlama dünyasında olabileceğini ve kullanılabileceğini düşünmenizi sağlar.
Ancak, C #, kuşkusuz dil tasarımı için C ++ ve Java'ya en sıkı baktı. Eiffel ve Modula-3 de resimde yer alırken, Eiffel'in birçok özelliği göz önüne alındığında (çoklu kalıtım) özel erişim değiştiricisine geldiğinde Java ve C ++ ile aynı yolu seçtiklerine inanıyorum.
Neden Eric Lippert, Krzysztof Cwalina, Anders Hejlsberg veya C # standardında çalışan herhangi bir kişiyi ele geçirmeye çalışmanız gerektiğini gerçekten bilmek istiyorsanız . Ne yazık ki, açıklamalı C # Programlama Dili'nde kesin bir not bulamadım .