Mengapa kerangka kerja Windows Forms / Swing lebih memilih warisan daripada Komposisi?

12

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?

melahap elysium
sumber
2
Banyak yang telah berubah dalam 15-20 tahun dimana API telah ada! Mesin rendering tidak memiliki lem XML ajaib untuk mengikat objek layar terhadap instance dari kelas konkret sewenang-wenang "kembali pada hari";)
1
Sebagian besar kode Swing yang saya lihat menggunakan ekstensi dengan komposisi. Saya tidak yakin dari mana prof Anda mendapatkan datanya.
Saya sendiri telah melihat banyak ayunan di internet dengan pewarisan alih-alih komposisi - kebanyakan tutorial sekalipun. tetapi bentuk windows benar-benar digunakan berdasarkan hanya oleh warisan!
melahap elysium

Jawaban:

7

JComponentmemperlihatkan banyak fungsi . Jika JComponentsuatu antarmuka dan komponen diimplementasikan dengan komposisi, komponen sederhana akan perlu memiliki puluhan pembungkus metode sepele, misalnya

class MyComponent implements JComponent {
    JPanel panel;
    public boolean contains(int x, int y) {
        return panel.contains(x, y);
    }
    ...
}

Ada juga alasan efisiensi untuk lebih memilih warisan daripada komposisi - mengganti biaya tanpa biaya (dengan asumsi tidak ada superpanggilan), sedangkan komposisi memerlukan biaya tambahan INVOKEVIRTUAL. Saya tidak tahu apakah ini memengaruhi desain Swing, tetapi ini merupakan masalah besar bagi kelas koleksi.

Daniel Lubarov
sumber
2

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.

Vincent Ramdhanie
sumber
"Yaitu, bentuk adalah komposisi dari wadah tingkat menengah dan kontrol." Tentu. Tapi yang biasanya saya lihat adalah ketika orang ingin membuat jendela sendiri (atau apa pun yang disebut dengan Swing), mereka akan mewarisi dari kelas jendela alih-alih menggunakan komposisi.
melahap elysium
@devoured elysium Itu benar. Tetapi untuk membuat bentuk mereka akan menggunakan komposisi. Jadi itu sedikit warisan dan banyak komposisi.
@devoured, saya pikir itu adalah kasus orang yang tidak menyadari bahwa tutorial yang mereka gunakan tidak mengikuti praktik terbaik karena mendukung singkatnya.
Peter Taylor
1

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.

John Gardner
sumber
Apa yang Anda maksud dengan "semuanya virtual "?
Jonas
di java, setiap metode secara implisit virtual (dapat ditimpa). Dalam C #, Anda harus secara eksplisit mendeklarasikan metode sebagai virtual, dan untuk menimpanya, Anda secara eksplisit mendeklarasikannya sebagai override. 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!)
John Gardner
Perhatikan bahwa Anda tidak bisa mengganti finalmetode di Java, bahkan jika kelas dasar itu sendiri tidak final.
pelaku
itu benar @perp. tetapi di java Anda harus keluar dari jalan Anda (menambahkan final) untuk mencegah virtual. C # adalah sebaliknya, Anda harus keluar dari jalan untuk menjadi virtual. Dan persentase yang sangat kecil dari runtime java standar ditandai final.
John Gardner
1

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 JTabledan JInternalFrame. Ini salah satu ukuran warisan dengan desain di Swing.

trashgod
sumber
-2

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

Saravanan
sumber
Saya tidak melihat relevansi untuk membuat kelas Kontrol WinForms baru. Bisakah Anda menguraikan?
Peter Taylor
@ Peter: Ini tidak terkait dengan hanya kelas bentuk windows. Ini juga dapat diterapkan dari kode kami. Anda dapat memperluas kelas yang ada dengan hanya menambahkan kelas statis dan kemudian menambahkan metode baru dengan argumen 1 karena ini sehingga objek dasar dapat ditautkan. Setelah Anda mengkompilasi kode, Anda mendapatkan metode yang baru ditambahkan sebagai metode dari kelas dasar itu sendiri. Inilah yang menyatakan komposisi. harap saya benar ..
Saravanan
1
Saya tahu apa metode ekstensi, dan mereka cukup berguna di kali, tetapi pertanyaan ini adalah tentang berbagai pendekatan untuk membuat kelas baru.
Peter Taylor
@ Peter: Maka saya hanya bisa menunjuk ke penggunaan kelas parsial saja, selain itu untuk pemahaman saya C # tidak memiliki fitur luar biasa lainnya. Jika Anda tahu, tolong beri tahu saya.
Saravanan