Haruskah kelas tahu tentang subkelasnya? Haruskah suatu kelas melakukan sesuatu yang spesifik untuk subkelas tertentu misalnya?
Naluriku mengatakan bahwa itu adalah desain yang buruk, sepertinya semacam anti-pola.
Haruskah kelas tahu tentang subkelasnya? Haruskah suatu kelas melakukan sesuatu yang spesifik untuk subkelas tertentu misalnya?
Naluriku mengatakan bahwa itu adalah desain yang buruk, sepertinya semacam anti-pola.
Jawaban:
Jawaban yang tersirat oleh konsep kelas adalah "tidak".
Entah tindakan, data, atau relasi apa pun yang Anda tangani adalah bagian dari semua subclass - maka itu harus ditangani dalam superclass tanpa memeriksa tipe yang sebenarnya. Atau itu hanya berlaku untuk beberapa subclass - maka Anda harus melakukan pemeriksaan tipe run-time untuk melakukan hal yang benar, superclass harus diubah setiap kali orang lain mewarisi darinya (atau mungkin diam-diam melakukan hal yang salah), perubahan pada kelas turunan dapat merusak superclass yang tidak berubah, dll
Singkatnya, Anda mendapatkan sejumlah konsekuensi buruk yang biasanya cukup buruk untuk menolak solusi semacam itu. Jika beberapa subclass Anda melakukan hal yang sama dan Anda ingin menghindari duplikasi kode (praktis selalu merupakan hal yang baik), solusi yang lebih baik adalah dengan memperkenalkan kelas tingkat menengah dari mana semua subclass tersebut dapat mewarisi kode.
sumber
Tidak hanya seandainya tidak tahu, ia juga tidak bisa ! Biasanya, kelas dapat diperpanjang kapan saja, di mana saja. Itu dapat diperpanjang oleh kelas yang bahkan tidak ada ketika ditulis.
Beberapa bahasa memungkinkan kelas yang diperluas dikendalikan oleh superclass. Dalam Scala, sebuah kelas dapat ditandai sebagai
sealed
, yang berarti bahwa ia hanya dapat diperluas oleh kelas-kelas lain dalam unit kompilasi yang sama (file sumber). Namun, kecuali jika subclass tersebut jugasealed
ataufinal
, subclass kemudian dapat diperpanjang oleh kelas lain.Dalam Scala, ini digunakan untuk memodelkan tipe data aljabar tertutup, sehingga
List
tipe Haskell kanonik :dapat dimodelkan dalam Scala seperti ini:
Dan Anda dapat menjamin bahwa hanya dua sub "kelas" yang ada karena
List
inisealed
dan dengan demikian tidak dapat diperpanjang di luar file,Cons
adalahfinal
dan dengan demikian tidak dapat diperpanjang sekali danNil
merupakanobject
yang tidak dapat diperpanjang pula.Tapi ini adalah kasus penggunaan khusus (pemodelan tipe data aljabar melalui pewarisan) dan bahkan dalam kasus ini, superclass tidak benar-benar tahu tentang subkelasnya. Ini lebih jaminan kepada pengguna dari
List
jenis bahwa jika ia melakukan diskriminasi kasusNil
danCons
, ada tidak akan ada lain alternatif bermunculan di belakang punggungnya.sumber
abstract internal
anggota.Jawaban sederhananya adalah TIDAK.
Itu membuat kode rapuh dan merusak dua prinsip dasar pemrograman berorientasi objek.
sumber
Ya kadang kadang. Misalnya, ketika ada jumlah subclass yang terbatas. Sebuah pola pengunjung adalah sebuah ilustrasi dari kegunaan pendekatan ini.
Contoh: node sintaksis abstrak (AST) dari beberapa tata bahasa yang terdefinisi dengan baik dapat diwarisi dari
Node
kelas tunggal yang menerapkan pola pengunjung untuk menangani semua tipe simpul.sumber
Node
, tentu saja, tidak mengandung referensi langsung ke subkelasnya. Tetapi itu berisiaccept
metode denganVisitor
parameter. DanVisitor
berisivisit
metode per setiap subclass. Jadi, meskipunNode
tidak memiliki referensi langsung ke subkelasnya, ia "tahu" tentang mereka secara tidak langsung, melaluiVisitor
antarmuka. Mereka semua digabungkan bersama-sama melaluinya.Jika saya menulis komponen untuk sebuah perusahaan dan kemudian, setelah saya pergi, seseorang memperluasnya untuk keperluan mereka sendiri, haruskah saya diberitahu tentang itu?
Tidak!
Sama dengan kelas. Percaya dengan nalurimu.
sumber