Güzel sorular. Yeniden ifade edeyim.
Bir yöntemi başka bir yöntemle gizlemek neden yasaldır?
Bu soruya bir örnekle cevap vereyim. CLR v1'den bir arayüzünüz var:
interface IEnumerable
{
IEnumerator GetEnumerator();
}
Süper. Şimdi CLR v2'de jeneriklere sahipsiniz ve "dostum, v1'de jenerik olsaydı bunu genel bir arayüz yapardım. Ama yapmadım. Şimdi onunla uyumlu bir şey yapmalıyım ki bu genel IEnumerable bekleyen kodla geriye dönük uyumluluğu kaybetmeden jeneriklerin avantajlarından yararlanıyorum. "
interface IEnumerable<T> : IEnumerable
{
IEnumerator<T> .... uh oh
GetEnumerator yöntemini ne olarak adlandıracaksınız IEnumerable<T>
? Seni hatırladım genel olmayan temel arayüzde GetEnumerator'ı gizlemesini istiyorsunuz . Sen asla bir geriye-compat durumda açıkça olmadıkça o şey çağrılmasını isteriz.
Tek başına bu, yöntemi gizlemeyi haklı çıkarır. Yöntem gizlemenin gerekçeleri hakkında daha fazla düşünce için bkz. için konuyla ilgili .
Neden "yeni" olmadan saklanmak bir uyarıya neden olur?
Çünkü bir şeyi sakladığınızı ve yanlışlıkla yapıyor olabileceğinizi dikkatinize sunmak istiyoruz. Unutmayın, türetilmiş sınıfınızı düzenlemek yerine başka biri tarafından temel sınıfa yapılan bir düzenleme nedeniyle yanlışlıkla bir şeyi gizliyor olabilirsiniz.
Neden hata yerine "yeni" bir uyarı olmadan saklanıyor?
Aynı sebep. Bir temel sınıfın yeni bir versiyonunu aldığınız için yanlışlıkla bir şey saklıyor olabilirsiniz. Bu her zaman olur. FooCorp, temel bir B sınıfı oluşturur. BarCorp, bir yöntem Bar ile türetilmiş bir D sınıfı oluşturur, çünkü müşterileri bu yöntemi sever. FooCorp bunu görüyor ve diyor ki, bu iyi bir fikir, bu işlevselliği temel sınıfa koyabiliriz. Bunu yaparlar ve Foo.DLL'nin yeni bir sürümünü gönderirler ve BarCorp yeni sürümü aldığında, yöntemlerinin artık temel sınıf yöntemini gizlediği söylense iyi olur.
Bu durumun bir hata değil bir uyarı olmasını istiyoruz çünkü bunu bir hata yapmak, bunun kırılgan temel sınıf probleminin başka bir biçimi olduğu anlamına gelir . C #, birisi temel bir sınıfa bir değişiklik yaptığında, türetilmiş bir sınıfı kullanan kod üzerindeki etkilerin en aza indirilmesi için dikkatlice tasarlanmıştır.
Neden gizleniyor ve varsayılanı geçersiz kılmıyor?
Çünkü sanal geçersiz kılma tehlikelidir . Sanal geçersiz kılma, türetilmiş sınıfların temel sınıfları kullanmak için derlenen kodun davranışını değiştirmesine izin verir. Geçersiz kılma gibi tehlikeli bir şey yapmak , tesadüfen değil, bilinçli ve kasıtlı olarak yaptığınız bir şey olmalıdır .