Menggunakan Pemrograman Berorientasi Objek kami memiliki kekuatan untuk membuat kelas di dalam kelas (kelas bersarang), tapi saya belum pernah membuat kelas bersarang dalam pengalaman coding selama 4 tahun.
Untuk apa kelas bersarang itu bagus?
Saya tahu bahwa suatu kelas dapat ditandai sebagai pribadi jika bersarang dan bahwa kita dapat mengakses semua anggota pribadi dari kelas itu dari kelas yang berisi. Kita bisa menempatkan variabel sebagai privat di kelas yang berisi itu sendiri.
Jadi mengapa membuat kelas bersarang?
Dalam skenario mana kelas bersarang harus digunakan atau apakah mereka lebih kuat dalam hal penggunaan dibandingkan teknik lainnya?
c#
object-oriented
programming-practices
.net
class-design
mayur rathi
sumber
sumber
Jawaban:
Fitur utama dari kelas bersarang adalah mereka dapat mengakses anggota pribadi dari kelas luar sambil memiliki kekuatan penuh dari kelas itu sendiri. Mereka juga dapat bersifat pribadi yang memungkinkan beberapa enkapsulasi yang cukup kuat dalam keadaan tertentu:
Di sini kita mengunci setter sepenuhnya ke pabrik karena kelasnya privat, tidak ada konsumen yang bisa menurunkan dan mengakses setter, dan kita bisa mengendalikan sepenuhnya apa yang diizinkan.
Selain itu berguna untuk mengimplementasikan antarmuka pihak ketiga dalam lingkungan yang terkendali di mana kita masih dapat mengakses anggota pribadi.
Sebagai contoh, jika kita menyediakan instance dari beberapa antarmuka ke beberapa objek lain, tetapi kita tidak ingin kelas utama kita mengimplementasikannya, kita bisa membiarkan kelas dalam mengimplementasikannya.
sumber
Outer
, Anda akan memberikanFunc<int>
, yang hanya akan menjadi() => _example
Inner
non-bersarang daninternal
tidak berfungsi (yaitu ketika Anda tidak berurusan dengan majelis yang berbeda). Hit terbaca dari kelas bersarang membuatnya kurang menguntungkan daripada menggunakaninternal
(jika mungkin).Biasanya, kelas N bersarang dibuat di dalam kelas C setiap kali C perlu menggunakan sesuatu secara internal yang tidak boleh (langsung) digunakan di luar C, dan untuk alasan apa pun bahwa sesuatu perlu jenis objek baru daripada beberapa yang sudah ada mengetik.
Saya percaya ini paling sering terjadi menerapkan metode yang mengembalikan objek yang mengimplementasikan beberapa antarmuka, dan kami ingin menjaga jenis konkret objek itu tersembunyi karena tidak akan berguna di tempat lain.
Menerapkan IEnumerable adalah contoh yang bagus untuk ini:
Tidak ada alasan bagi siapa pun di luar
BlobOfBusinessData
untuk mengetahui atau peduli tentang hal yang konkretBusinessDatumEnumerator
jenis , jadi sebaiknya kita menyimpannya di dalamBlobOfBusinessData
.Itu tidak dimaksudkan untuk menjadi contoh "praktik terbaik" tentang bagaimana menerapkan
IEnumerable
dengan benar, hanya minimum untuk menyampaikan ide, jadi saya meninggalkan hal-hal sepertiIEnumerable.GetEnumerator()
metode eksplisit .sumber
Node
kelas di aLinkedList
. Siapa pun yang menggunakanLinkedList
tidak peduli bagaimanaNode
penerapannya, selama mereka dapat mengakses konten. Satu-satunya entitas yang peduli sama sekali adalahLinkedList
kelas itu sendiri.Saya dapat memikirkan beberapa alasan penting:
1. Aktifkan enkapsulasi
Berkali-kali kelas bersarang adalah detail implementasi kelas. Pengguna kelas utama tidak harus peduli dengan keberadaan mereka. Anda harus dapat mengubahnya sesuka hati tanpa mengharuskan pengguna kelas utama untuk mengubah kode mereka.
2. Hindari pencemaran nama
Anda tidak harus menambahkan tipe, variabel, fungsi, dll. Dalam cakupan kecuali mereka sesuai dalam lingkup itu. Ini sedikit berbeda dari enkapsulasi. Mungkin bermanfaat untuk mengekspos antarmuka dari tipe bersarang tetapi tempat yang tepat untuk tipe bersarang masih merupakan kelas utama. Di tanah C ++, tipe iterator adalah salah satu contohnya. Saya tidak berpengalaman dalam C # cukup untuk memberikan contoh konkret di dalamnya.
Mari kita membuat contoh sederhana untuk menggambarkan mengapa memindahkan kelas bersarang ke ruang lingkup yang sama dengan kelas utama adalah polusi nama. Katakanlah Anda menerapkan kelas daftar tertaut. Biasanya, Anda akan menggunakannya
Jika Anda memutuskan untuk
Node
naik ke cakupan yang sama denganLinkedList
, Anda akan memilikinyaLinkedListNode
tidak mungkin berguna tanpaLinkedList
kelas itu sendiri. Bahkan jikaLinkedList
disediakan beberapa fungsi yang mengembalikanLinkedListNode
objek yangLinkedList
bisa digunakan pengguna, itu tetapLinkedListNode
berguna hanya ketikaLinkedList
digunakan. Untuk alasan itu, membuat kelas "simpul" kelas sebayaLinkedList
mencemari ruang lingkup yang berisi.sumber
Saya menggunakan kelas bersarang publik untuk kelas pembantu terkait.
Gunakan mereka untuk variasi terkait.
Penelepon dapat memilih versi mana yang cocok untuk masalah yang mana. Kadang-kadang sebuah kelas tidak dapat dibangun sepenuhnya dalam satu pass, dan membutuhkan versi yang bisa berubah. Ini selalu benar ketika menangani data siklik. Mutables dapat dikonversi menjadi read-only nanti.
Saya menggunakannya untuk catatan internal
sumber
Nested Class dapat digunakan kapan pun Anda ingin membuat lebih dari satu kali instance dari kelas atau setiap kali Anda ingin membuat tipe itu lebih tersedia.
Nested Class meningkatkan enkapsulasi dan juga akan menghasilkan kode yang lebih mudah dibaca dan dipelihara.
sumber