Saya ingin mendengar apa motivasi di balik sebagian besar kelas tertutup dalam kerangka kerja .Net. Apa manfaat menyegel kelas? Saya tidak dapat memahami bagaimana tidak mengizinkan warisan dapat berguna dan kemungkinan besar bukan satu-satunya yang melawan kelas-kelas ini.
Jadi, mengapa kerangka kerja dirancang seperti ini dan bukankah itu akan menjadi perubahan besar untuk membuka segel semuanya? Pasti ada alasan lain selain menjadi jahat?
.net
performance
mmiika
sumber
sumber
Jawaban:
Artikel MSDN untuk topik ini membatasi Ekstensibilitas oleh Kelas Sealing .
sumber
Kelas harus dirancang untuk warisan atau melarangnya. Ada biaya untuk mendesain warisan:
Item 17 dari Java Efektif menjelaskan lebih detail tentang ini - terlepas dari fakta bahwa itu ditulis dalam konteks Java, saran ini berlaku untuk .NET juga.
Secara pribadi saya berharap kelas disegel secara default di .NET.
sumber
Tampaknya pedoman resmi Microsoft tentang penyegelan telah berevolusi sejak pertanyaan ini diajukan ~ 9 tahun yang lalu, dan mereka beralih dari filosofi keikutsertaan (segel secara default) ke menyisih (jangan segel secara default):
Memang, jika Anda mencari basis kode ASP.Net Core , Anda hanya akan menemukan sekitar 30 kejadian
sealed class
, yang sebagian besar merupakan atribut dan kelas uji.Menurut saya, konservasi keabadian adalah argumen yang baik untuk mendukung penyegelan.
sumber
Saya menemukan kalimat ini dalam dokumentasi msdn: "Kelas tertutup terutama digunakan untuk mencegah penurunan. Karena mereka tidak pernah dapat digunakan sebagai kelas dasar, beberapa pengoptimalan waktu berjalan dapat membuat panggilan anggota kelas tertutup sedikit lebih cepat."
Saya tidak tahu apakah pertunjukan adalah satu-satunya keuntungan dari kelas tersegel dan secara pribadi saya juga ingin mengetahui alasan lain ...
sumber
Kinerja merupakan faktor penting misalnya, kelas string di java bersifat final (<- disegel) dan alasannya adalah kinerja saja. Saya pikir poin penting lainnya adalah untuk menghindari masalah kelas dasar rapuh yang dijelaskan secara rinci di sini: http://blogs.msdn.com/ericlippert/archive/2004/01/07/virtual-methods-and-brittle-base-classes. aspx
Jika Anda menyediakan kerangka kerja, penting untuk proyek lama pemeliharaan dan untuk meningkatkan kerangka kerja Anda untuk menghindari masalah kelas dasar yang rapuh
sumber
String
kelas tersebut bahkan mungkin tidak mungkin untuk membuat subkelas, meskipun itu belum final.Sealed digunakan untuk mencegah "masalah kelas dasar rapuh". Saya menemukan artikel bagus di MSDN yang menjelaskan hal itu.
sumber
Sealing memungkinkan Anda menyadari beberapa peningkatan kinerja kecil. Ini kurang benar di dunia JIT dan pesimisasi malas daripada di dunia, katakanlah C ++, tetapi karena .NET tidak sebagus pesimisasi seperti kompiler java sebagian besar karena filosofi desain yang berbeda, itu masih berguna. Ini memberi tahu kompiler bahwa ia bisa langsung memanggil metode virtual apa pun daripada memanggilnya secara tidak langsung melalui vtable.
Ini juga penting ketika Anda menginginkan 'dunia tertutup' untuk hal-hal seperti perbandingan kesetaraan. Biasanya begitu saya mendefinisikan metode virtual, saya cukup tersirat untuk mendefinisikan gagasan perbandingan kesetaraan yang benar-benar mengimplementasikan gagasan itu. Di sisi lain, saya mungkin dapat mendefinisikannya untuk subkelas tertentu dari kelas dengan metode virtual. Menyegel kelas itu memastikan bahwa kesetaraan benar-benar berlaku.
sumber
Menyegel kelas membuat pengelolaan sumber daya sekali pakai lebih mudah.
sumber
Untuk menentukan apakah akan menyegel kelas, metode, atau properti, Anda biasanya harus mempertimbangkan dua poin berikut:
• Manfaat potensial yang mungkin diperoleh dari kelas-kelas melalui kemampuan untuk menyesuaikan kelas Anda.
• Potensi yang menurunkan kelas dapat mengubah kelas Anda sedemikian rupa sehingga kelas tidak lagi berfungsi dengan benar atau seperti yang diharapkan.
sumber
Pertimbangan lebih lanjut adalah bahwa kelas tertutup tidak dapat dihentikan dalam pengujian unit Anda. Dari dokumentasi Microsoft :
sumber