Saya terkejut bahwa tampaknya ada konsensus di sini bahwa non-virtual-by-default adalah cara yang tepat untuk melakukan sesuatu. Saya akan turun di sisi lain - saya pikir pragmatis - sisi pagar.
Sebagian besar pembenaran bagi saya seperti argumen lama "Jika kami memberi Anda kekuatan, Anda mungkin melukai diri sendiri". Dari programmer ?!
Bagi saya, pembuat kode yang tidak cukup tahu (atau memiliki cukup waktu) untuk mendesain perpustakaan mereka untuk warisan dan / atau ekstensibilitas adalah pembuat kode yang menghasilkan persis perpustakaan yang mungkin harus saya perbaiki atau ubah - persis perpustakaan tempat kemampuan untuk menimpa akan sangat berguna.
Berapa kali saya harus menulis kode penyelesaian yang jelek dan putus asa (atau meninggalkan penggunaan dan menggulung solusi alternatif saya sendiri) karena saya tidak dapat menimpa jauh, jauh melebihi berapa kali saya pernah digigit ( misalnya di Jawa) dengan menimpa di mana desainer mungkin tidak mempertimbangkan saya mungkin.
Non-virtual-by-default membuat hidup saya lebih sulit.
UPDATE: Telah ditunjukkan [dengan benar] bahwa saya sebenarnya tidak menjawab pertanyaan itu. Jadi - dan dengan permintaan maaf karena agak terlambat ....
Saya agak ingin dapat menulis sesuatu yang bernas seperti "C # mengimplementasikan metode sebagai non-virtual secara default karena keputusan yang buruk dibuat yang menghargai program lebih tinggi daripada programmer". (Saya pikir itu bisa dibenarkan berdasarkan beberapa jawaban lain untuk pertanyaan ini - seperti kinerja (pengoptimalan prematur, siapa saja?), Atau menjamin perilaku kelas.)
Namun, saya menyadari bahwa saya hanya akan menyatakan pendapat saya dan bukan jawaban pasti yang diinginkan Stack Overflow. Tentunya, saya pikir, pada tingkat tertinggi jawaban definitif (tetapi tidak membantu) adalah:
Mereka non-virtual secara default karena desainer bahasa harus membuat keputusan dan itulah yang mereka pilih.
Sekarang saya rasa alasan pasti mereka membuat keputusan itu, kami tidak akan pernah .... oh, tunggu! Transkrip percakapan!
Jadi tampaknya jawaban dan komentar di sini tentang bahaya override API dan kebutuhan untuk mendesain secara eksplisit untuk pewarisan berada di jalur yang benar tetapi semuanya kehilangan aspek temporal yang penting: Perhatian utama Anders adalah tentang mempertahankan kelas atau implisit API kontrak lintas versi . Dan saya pikir dia sebenarnya lebih peduli tentang mengizinkan platform .Net / C # untuk berubah di bawah kode daripada peduli tentang perubahan kode pengguna di atas platform. (Dan sudut pandang "pragmatis" nya adalah kebalikan dari saya karena dia melihat dari sisi lain.)
(Tapi tidak bisakah mereka memilih virtual-by-default dan kemudian membumbui "final" melalui basis kode? Mungkin itu tidak persis sama .. dan Anders jelas lebih pintar dari saya jadi saya akan membiarkannya berbohong.)
this
referensinya null. Lihat di sini untuk info lebih lanjut.