Burada, varsayılan olarak sanal olmayanın işleri yapmanın doğru yolu olduğu konusunda böyle bir fikir birliği olduğuna şaşırıyorum. Çitin öteki tarafına - pragmatik olduğunu düşünüyorum - aşağı ineceğim.
Gerekçelerin çoğu bana eski "Size güç verirsek kendinize zarar verebilirsiniz" argümanı gibi okunuyor. Programcılardan mı ?!
Bana öyle geliyor ki, kütüphanesini miras ve / veya genişletilebilirlik için tasarlamak için yeterince bilmeyen (veya yeterli zamanı olan) kodlayıcı, tam olarak düzeltmem veya ayarlamam gereken kütüphaneyi üreten kodlayıcıdır - tam olarak geçersiz kılma yeteneğinin en yararlı olacağı kütüphane.
Çirkin, çaresiz bir çözüm kodu yazmak zorunda kaldığım (veya kullanımdan vazgeçip kendi alternatif çözümümü yuvarlamak için) kaç kez geçersiz kılamıyorum çünkü ısırıldığımdan çok daha ağır basmaktadır ( örneğin Java'da) tasarımcının yapabileceğimi düşünmemiş olabileceği yerleri geçersiz kılarak.
Varsayılan olarak sanal olmaması hayatımı zorlaştırıyor.
GÜNCELLEME: Soruyu gerçekten cevaplamadığım [oldukça doğru bir şekilde] belirtildi. Yani - ve geç kaldığım için özür dilerim ...
"C #, yöntemleri varsayılan olarak sanal olmayan olarak uygular, çünkü programlara programcılardan daha fazla değer veren kötü bir karar verildi" gibi özlü bir şey yazabilmek istedim. (Sanırım bu, bu soruya verilecek diğer yanıtlardan bazılarına dayanarak - performans (erken optimizasyon, herhangi biri?) Veya sınıfların davranışını garanti altına alma gibi bir şekilde haklı gösterilebilir.)
Ancak, Stack Overflow'un istediği kesin yanıtı değil, kendi fikrimi ifade ettiğimin farkındayım. Şüphesiz, en üst düzeyde kesin (ama yararsız) cevabın şöyle olduğunu düşündüm:
Varsayılan olarak sanal değillerdir çünkü dil tasarımcılarının vermesi gereken bir karar vardı ve onlar da bunu seçtiler.
Şimdi sanırım bu kararı vermelerinin kesin nedeni, biz asla .... oh, bekle! Bir konuşmanın metni!
Öyleyse, API'leri geçersiz kılma tehlikeleri ve kalıtım için açık bir şekilde tasarlama ihtiyacı hakkındaki cevaplar ve yorumlar doğru yoldadır, ancak hepsinin önemli bir zamansal yönü eksiktir: Anders'in asıl endişesi, bir sınıfın veya API'nin örtülü olarak sürdürülmesiydi. sürümler arasında sözleşme . Ve sanırım aslında, platformun üstündeki kullanıcı kodu değişikliği ile ilgilenmek yerine .Net / C # platformunun kod altında değişmesine izin verme konusunda endişeli. (Ve onun "pragmatik" bakış açısı benimkinin tam tersi çünkü diğer taraftan bakıyor.)
(Ama varsayılan olarak sanal olanı seçip sonra kod tabanında "final" i seçmiş olamazlar mı? Belki de bu tam olarak aynı değildir .. ve Anders açıkça benden daha zeki, bu yüzden yalan söylemesine izin vereceğim.)
this
referans boş ise farklı davranan bir yönteme sahip olmak mümkün değildir . Daha fazla bilgi için buraya bakın .