Hari ini seorang profesor saya berkomentar bahwa dia merasa aneh bahwa sementara filosofi SWT adalah membuat kontrol Anda sendiri dengan komposisi, Swing tampaknya lebih menyukai warisan.
Saya hampir tidak memiliki kontak dengan kedua kerangka kerja, tetapi dari apa yang saya ingat dalam Formulir Windows C #, orang biasanya memperluas kontrol, seperti Swing.
Menjadi yang umumnya orang cenderung lebih suka komposisi daripada warisan, mengapa orang-orang Swing / Windows Forms lebih memilih komposisi daripada warisan?
Jawaban:
JComponent
memperlihatkan banyak fungsi . JikaJComponent
suatu antarmuka dan komponen diimplementasikan dengan komposisi, komponen sederhana akan perlu memiliki puluhan pembungkus metode sepele, misalnyaAda juga alasan efisiensi untuk lebih memilih warisan daripada komposisi - mengganti biaya tanpa biaya (dengan asumsi tidak ada
super
panggilan), sedangkan komposisi memerlukan biaya tambahanINVOKEVIRTUAL
. Saya tidak tahu apakah ini memengaruhi desain Swing, tetapi ini merupakan masalah besar bagi kelas koleksi.sumber
Swing Framework sebenarnya dirancang sesuai dengan Pola Desain Komposit. Memang ada banyak warisan di sana, tetapi Anda biasanya akan menulis formulir sendiri menggunakan komposisi. Artinya, formulir adalah komposisi wadah tingkat menengah dan kontrol.
sumber
Dengan Java, jauh lebih mudah untuk menggunakan warisan hanya karena semuanya virtual. Perlu memperbaiki "fitur" di JTable / JFrame? Perluas itu, timpa metode masalah, dan kemudian gunakan Tabel / Frame Anda di mana-mana.
Saya pikir dengan hal-hal seperti WPF, di mana pengikatan data adalah fitur utama dari desain, membuatnya lebih mudah untuk melakukan komposisi daripada pewarisan.
sumber
virtual
, dan untuk menimpanya, Anda secara eksplisit mendeklarasikannya sebagaioverride
. Di java, Anda bisa menimpa apa pun yang bisa Anda lihat, dan Anda dapat meningkatkan visibilitasnya dalam subclass (Anda dapat membuat metode yang dilindungi publik di subclass!)final
metode di Java, bahkan jika kelas dasar itu sendiri tidakfinal
.Dalam Java Efektif , Butir 17, Bloch menyebutkan bahwa kelas yang dirancang untuk pewarisan "harus mendokumentasikan penggunaannya sendiri atas metode yang dapat ditimpa." Ciri khas dari ini adalah ungkapan implementasi ini . Anda akan melihatnya di kelas seperti
JTable
danJInternalFrame
. Ini salah satu ukuran warisan dengan desain di Swing.sumber
Dari C # 3.5, kami memiliki konsep yang disebut sebagai Metode Ekstensi yang memungkinkan konsep komposisi daripada pewarisan.
Dalam proses ini, kami menerapkan fungsionalitas yang diperluas ke kelas yang ada hanya dengan menambahkan kelas ekstensi yang menjadikan fitur baru ke kelas yang ada.
Anda dapat merujuk di sini untuk detail lebih lanjut
sumber