Seperti yang dikatakan Anders , sebagian tentang kinerja dan sebagian lagi tentang mengunci rancangan yang buruk untuk mengurangi ruang lingkup masalah yang terjadi kemudian oleh orang-orang yang secara buta mewarisi hal-hal yang tidak dirancang untuk diwariskan.
Performa tampak jelas - sementara sebagian besar metode tidak akan diperhatikan pada perangkat keras modern, pengambil virtual mungkin menyebabkan hit yang cukup mencolok, bahkan pada perangkat keras modern yang semakin bergantung pada instruksi yang diprediksi dengan mudah dalam pipa CPU.
Sekarang alasan untuk membuat semuanya virtual secara default tampaknya didorong oleh satu hal saja: kerangka kerja unit testing. Tampaknya bagi saya bahwa ini adalah alasan yang buruk, di mana kami mengubah kode agar sesuai dengan kerangka kerja daripada mendesainnya dengan benar.
Mungkin masalahnya adalah dengan kerangka kerja yang digunakan di sini, mereka harus meningkatkan untuk memungkinkan penggantian fungsi saat runtime dengan shims yang disuntikkan daripada membangun kode yang melakukan ini (dengan semua peretasan untuk mendapatkan putaran metode pribadi maupun yang non-virtual, tidak untuk menyebutkan fungsi statis dan pihak ketiga)
Jadi metode alasan tidak virtual secara default adalah seperti yang dikatakan Anders, dan setiap keinginan untuk membuatnya virtual agar sesuai dengan beberapa alat unit test adalah menempatkan kereta di depan kuda, desain yang tepat mengalahkan kendala buatan.
Sekarang Anda dapat mengurangi semua ini dengan menggunakan antarmuka, atau dengan mengerjakan ulang seluruh basis kode Anda untuk menggunakan komponen (atau layanan Microsoft) yang berkomunikasi melalui pesan yang lewat alih-alih panggilan metode kabel langsung. Jika Anda memperbesar permukaan unit untuk pengujian menjadi komponen, dan komponen itu sepenuhnya mandiri, Anda tidak perlu mengacaukannya untuk mengujinya.