Apakah Komposisi dan Warisan sama? Jika saya ingin menerapkan pola komposisi, bagaimana saya bisa melakukannya di Jawa?
java
oop
inheritance
composition
gmhk
sumber
sumber
Jawaban:
Mereka benar-benar berbeda. Warisan adalah "is-a" . Komposisi adalah "memiliki-a" .
Anda melakukan komposisi dengan memiliki instance kelas lain
C
sebagai bidang kelas Anda, alih-alih memperluasC
. Contoh yang bagus di mana komposisi akan jauh lebih baik daripada warisanjava.util.Stack
, yang saat ini meluasjava.util.Vector
. Ini sekarang dianggap sebagai kesalahan besar. Setumpuk vektor "is-NOT-a" ; Anda seharusnya tidak diizinkan untuk menyisipkan dan menghapus elemen secara sewenang-wenang. Seharusnya komposisi bukan.Sayangnya sudah terlambat untuk memperbaiki kesalahan desain ini, karena mengubah hierarki warisan sekarang akan merusak kompatibilitas dengan kode yang ada. Pernah
Stack
menggunakan komposisi alih-alih pewarisan, selalu dapat dimodifikasi untuk menggunakan struktur data lain tanpa melanggar API .Saya sangat merekomendasikan buku Josh Bloch Effective Java 2nd Edition
Desain berorientasi objek yang baik bukan tentang memperluas kelas yang ada secara bebas. Naluri pertamamu adalah menulis.
Lihat juga:
sumber
Komposisi berarti
HAS A
Warisan berarti
IS A
Example
: Mobil memiliki Mesin dan Mobil adalah OtomotifDalam pemrograman ini direpresentasikan sebagai:
sumber
:-/
type
bidang TipeEnum
Bagaimana warisan bisa berbahaya?
Mari kita ambil contoh
1) Seperti yang jelas dalam kode di atas, Kelas Y memiliki kopling yang sangat kuat dengan kelas X. Jika ada perubahan dalam superclass X, Y dapat pecah secara dramatis. Misalkan Di kelas X mengimplementasikan metode kerja dengan tanda tangan di bawah ini
Perubahan dilakukan di kelas X tetapi itu akan membuat kelas Y tidak dapat dikompilasi. JADI ketergantungan seperti ini bisa naik ke tingkat apa pun dan itu bisa sangat berbahaya. Setiap kali superclass mungkin tidak memiliki visibilitas penuh ke kode di dalam semua subkelasnya dan subkelas mungkin terus memperhatikan apa yang terjadi di superclass sepanjang waktu. Jadi kita harus menghindari sambungan yang kuat dan tidak perlu ini.
Bagaimana komposisi memecahkan masalah ini?
Mari kita lihat dengan merevisi contoh yang sama
Di sini kita membuat referensi kelas X di kelas Y dan menerapkan metode kelas X dengan membuat turunan dari kelas X. Sekarang semua kopling kuat itu hilang. Superclass dan subclass sangat independen satu sama lain sekarang. Kelas dapat dengan bebas membuat perubahan yang berbahaya dalam situasi warisan.
2) Keunggulan komposisi kedua yang sangat baik karena memberikan fleksibilitas pemanggilan metode, misalnya:
Di kelas Uji menggunakan r referensi saya bisa memanggil metode kelas X serta kelas Y. Fleksibilitas ini tidak pernah ada dalam warisan
3) Keuntungan besar lainnya: Unit testing
Dalam contoh di atas, jika keadaan x instance tidak diketahui, ia dapat dengan mudah diejek dengan menggunakan beberapa data uji dan semua metode dapat dengan mudah diuji. Ini tidak mungkin sama sekali dalam warisan karena Anda sangat bergantung pada superclass untuk mendapatkan status instance dan menjalankan metode apa pun.
4) Alasan bagus lainnya mengapa kita harus menghindari pewarisan adalah bahwa Java tidak mendukung pewarisan berganda.
Mari kita ambil contoh untuk memahami ini:
Senang mendengarnya :
komposisi mudah dicapai saat runtime sementara warisan menyediakan fitur-fiturnya pada waktu kompilasi
komposisi juga dikenal sebagai hubungan HAS-A dan pewarisan juga dikenal sebagai hubungan IS-A
Jadi biasakan selalu lebih suka komposisi daripada warisan karena berbagai alasan di atas.
sumber
Jawaban yang diberikan oleh @Michael Rodrigues tidak benar (saya minta maaf; Saya tidak dapat berkomentar secara langsung), dan dapat menyebabkan beberapa kebingungan.
Implementasi antarmuka adalah bentuk warisan ... ketika Anda mengimplementasikan antarmuka, Anda tidak hanya mewarisi semua konstanta, Anda juga membuat objek Anda menjadi tipe yang ditentukan oleh antarmuka; ini masih merupakan hubungan " is-a ". Jika sebuah mobil mengimplementasikan Fillable , mobil " is-a " Fillable , dan dapat digunakan dalam kode Anda di mana pun Anda akan menggunakan Fillable .
Komposisi pada dasarnya berbeda dari warisan. Saat Anda menggunakan komposisi, Anda (seperti jawaban jawaban lainnya) membuat hubungan " memiliki-a " antara dua objek, yang bertentangan dengan hubungan " is-a " yang Anda buat saat menggunakan warisan .
Jadi, dari contoh mobil di pertanyaan lain, jika saya ingin mengatakan bahwa mobil " memiliki " tangki bensin, saya akan menggunakan komposisi, sebagai berikut:
Semoga itu menghilangkan kesalahpahaman.
sumber
Warisan memunculkan relasi IS-A . Komposisi memunculkan hubungan HAS-A . Pola strategi menjelaskan bahwa Komposisi harus digunakan dalam kasus di mana ada keluarga algoritma yang mendefinisikan perilaku tertentu.
Contoh klasik adalah kelas bebek yang menerapkan perilaku terbang.
Dengan demikian kita dapat memiliki beberapa kelas yang menerapkan terbang misalnya:
Seandainya itu untuk warisan, kita akan memiliki dua kelas burung yang berbeda yang menerapkan fungsi terbang berulang-ulang. Jadi warisan dan komposisi sama sekali berbeda.
sumber
Komposisi seperti kedengarannya - Anda membuat objek dengan mencolokkan bagian-bagian.
Sunting Sisa dari jawaban ini secara keliru berdasarkan pada premis berikut.
Ini dilakukan dengan Antarmuka.
Misalnya, menggunakan
Car
contoh di atas,Jadi dengan beberapa komponen teoritis standar Anda dapat membangun objek Anda. Maka tugas Anda untuk mengisi bagaimana seorang
House
melindungi penghuninya, dan bagaimana seorangCar
melindungi penghuninya.Warisan seperti sebaliknya. Anda mulai dengan objek yang lengkap (atau semi-lengkap) dan Anda mengganti atau mengganti berbagai bit yang ingin Anda ubah.
Misalnya,
MotorVehicle
mungkin datang denganFuelable
metode danDrive
metode. Anda dapat meninggalkan metode Bahan Bakar seperti itu karena itu sama untuk mengisi sepeda motor dan mobil, tetapi Anda dapat menggantiDrive
metode karena Motorbike drive sangat berbeda keCar
.Dengan pewarisan, beberapa kelas sudah sepenuhnya diimplementasikan, dan yang lain memiliki metode yang terpaksa Anda timpa. Dengan Komposisi tidak ada yang diberikan kepada Anda. (tetapi Anda dapat mengimplementasikan antarmuka dengan memanggil metode di kelas lain jika Anda memiliki sesuatu yang bertebaran).
Komposisi dipandang lebih fleksibel, karena jika Anda memiliki metode seperti iUsesFuel, Anda dapat memiliki metode di tempat lain (kelas lain, proyek lain) yang hanya khawatir tentang berurusan dengan objek yang dapat diisi bahan bakar, terlepas dari apakah itu mobil, kapal, kompor, barbecue, dll. Antarmuka mengamanatkan bahwa kelas yang mengatakan mereka mengimplementasikan antarmuka itu sebenarnya memiliki metode yang terkait dengan antarmuka itu. Sebagai contoh,
maka Anda dapat memiliki metode di tempat lain
Contoh aneh, tetapi itu menunjukkan bahwa metode ini tidak peduli apa yang mengisi, karena objek mengimplementasikan
iUsesFuel
, itu dapat diisi. Akhir dari cerita.Jika Anda menggunakan Inheritance sebagai gantinya, Anda akan memerlukan
FillHerUp
metode yang berbeda untuk menanganiMotorVehicles
danBarbecues
, kecuali jika Anda memiliki beberapa objek dasar "ObjectThatUsesFuel" yang agak aneh untuk mewarisi.sumber
ThisCase
, bukan dalamcamelCase
. Oleh karena itu yang terbaik untuk memberi nama antarmuka AndaIDrivable
, dll. Anda mungkin tidak perlu "I" jika Anda mengelompokkan kembali semua antarmuka Anda ke dalam paket dengan benar.Mereka tidak sama.
Komposisi : Ini memungkinkan sekelompok objek harus diperlakukan dengan cara yang sama dengan satu instance objek. Maksud dari suatu komposit adalah untuk "menyusun" objek ke dalam struktur pohon untuk mewakili hierarki bagian-keseluruhan
Warisan : Kelas mewarisi bidang dan metode dari semua kacamata supernya, baik langsung maupun tidak langsung. Subclass dapat menimpa metode yang diwarisi, atau dapat menyembunyikan bidang atau metode yang diwarisi.
Artikel Wikipedia cukup bagus untuk menerapkan pola komposit di java.
Peserta Utama:
Komponen :
Daun :
Komposit :
Contoh kode untuk memahami pola Komposit :
keluaran:
Penjelasan:
Lihat pertanyaan di bawah ini untuk Pro dan Kontra Komposisi dan Warisan.
Lebih suka komposisi daripada warisan?
sumber
sebagai contoh lain, pertimbangkan kelas mobil, ini akan menjadi penggunaan komposisi yang baik, mobil akan "memiliki" mesin, transmisi, ban, kursi, dll. Itu tidak akan memperpanjang kelas-kelas itu.
sumber
Komposisi adalah di mana sesuatu terdiri dari bagian-bagian yang berbeda dan memiliki hubungan yang kuat dengan bagian-bagian itu. Jika bagian utama mati begitu juga yang lain, mereka tidak dapat memiliki kehidupan mereka sendiri. Contoh kasar adalah tubuh manusia. Keluarkan hati dan semua bagian lainnya mati.
Warisan adalah tempat Anda mengambil sesuatu yang sudah ada dan menggunakannya. Tidak ada hubungan yang kuat. Seseorang dapat mewarisi tanah leluhurnya tetapi dia dapat melakukannya tanpa itu.
Saya tidak tahu Java jadi saya tidak bisa memberikan contoh tetapi saya bisa memberikan penjelasan konsep.
sumber
Warisan antara dua kelas, di mana satu kelas memperluas kelas lain membangun hubungan " IS A ".
Komposisi di ujung yang lain berisi instance kelas lain di kelas Anda menetapkan hubungan " Memiliki A ". Komposisi dalam java berguna karena secara teknis memfasilitasi multiple inheritance.
sumber
Secara Sederhana Agregasi Kata Berarti Memiliki Hubungan ..
Komposisi adalah kasus agregasi khusus . Dengan cara yang lebih spesifik, agregasi terbatas disebut komposisi. Ketika suatu objek berisi objek lain, jika objek yang terkandung tidak dapat eksis tanpa adanya objek kontainer, maka itu disebut komposisi. Contoh: Kelas berisi siswa. Seorang siswa tidak dapat ada tanpa kelas. Ada komposisi antara kelas dan siswa.
Mengapa Menggunakan Agregasi
Kode Reusability
Saat Menggunakan Agregasi
Penggunaan kembali kode juga paling baik dicapai dengan agregasi ketika tidak ada kapal Relation
Warisan
Inheritance adalah Hubungan Orangtua Anak. Inheritance Means Is A RelationShip
Warisan dalam java adalah mekanisme di mana satu objek memperoleh semua properti dan perilaku objek induk.
Menggunakan pewarisan di Java 1 Code Reusability. 2 Tambahkan Fitur Ekstra di Kelas Anak dan juga Metode Overriding (sehingga polimorfisme runtime dapat dicapai).
sumber
Meskipun kedua Pewarisan dan Komposisi menyediakan penggunaan kembali kode, perbedaan utama antara Komposisi dan Pewarisan di Jawa adalah bahwa Komposisi memungkinkan penggunaan kembali kode tanpa memperluasnya, tetapi untuk Warisan Anda harus memperluas kelas untuk setiap penggunaan kembali kode atau fungsi. Perbedaan lain yang berasal dari fakta ini adalah bahwa dengan menggunakan Komposisi Anda dapat menggunakan kembali kode bahkan untuk kelas akhir yang tidak dapat diperluas tetapi Warisan tidak dapat menggunakan kembali kode dalam kasus tersebut. Juga dengan menggunakan Komposisi Anda dapat menggunakan kembali kode dari banyak kelas karena mereka dinyatakan hanya sebagai variabel anggota, tetapi dengan Inheritance Anda dapat menggunakan kembali bentuk kode hanya satu kelas karena di Jawa Anda hanya dapat memperluas satu kelas, karena beberapa Warisan tidak didukung di Jawa . Anda dapat melakukan ini di C ++ karena ada satu kelas dapat memperpanjang lebih dari satu kelas. BTW, Anda harus selalulebih suka Komposisi daripada Warisan di Jawa , itu bukan hanya saya tetapi bahkan Joshua Bloch telah menyarankan dalam bukunya
sumber
Saya pikir contoh ini menjelaskan dengan jelas perbedaan antara pewarisan dan komposisi .
Dalam contoh ini, masalahnya diselesaikan menggunakan pewarisan dan komposisi. Penulis memperhatikan fakta bahwa; dalam pewarisan , perubahan dalam superclass dapat menyebabkan masalah di kelas turunan, yang mewarisinya.
Di sana Anda juga dapat melihat perbedaan dalam representasi ketika Anda menggunakan UML untuk pewarisan atau komposisi.
http://www.javaworld.com/article/2076814/core-java/inheritance-versus-composition--which-one-should-you-choose-.html
sumber
Komposisi Pewarisan Vs.
Warisan dan komposisi keduanya digunakan untuk kegunaan ulang dan perluasan perilaku kelas.
Warisan terutama digunakan dalam model pemrograman algoritma keluarga seperti jenis hubungan IS-A berarti jenis objek yang sama. Contoh.
Ini milik keluarga Car.
Komposisi merepresentasikan tipe hubungan HAS-A. Ini menunjukkan kemampuan suatu objek seperti Duster memiliki Lima Gigi, Safari memiliki empat Gigi dll. Setiap kali kita perlu memperluas kemampuan kelas yang ada kemudian menggunakan komposisi. Contoh kita perlu menambahkan satu lagi gear pada objek Duster maka kita harus membuat satu lagi objek gear dan menyusunnya ke objek duster.
Kita tidak boleh membuat perubahan di kelas dasar sampai / kecuali semua kelas turunan membutuhkan fungsionalitas tersebut. Untuk skenario ini kita harus menggunakan Komposisi. Seperti
kelas A Berasal dari Kelas B
Kelas A Berasal dari Kelas C
Kelas A Berasal dari Kelas D.
Ketika kita menambahkan fungsionalitas apa pun di kelas A maka itu tersedia untuk semua sub kelas bahkan ketika Kelas C dan D tidak memerlukan fungsionalitas tersebut. Untuk skenario ini kita perlu membuat kelas terpisah untuk fungsionalitas tersebut dan menyusunnya ke kelas yang diperlukan ( di sini adalah kelas B).
Di bawah ini adalah contohnya:
sumber
Komposisi berarti membuat objek ke kelas yang memiliki hubungan dengan kelas tertentu. Misalkan Siswa memiliki hubungan dengan Akun;
Warisan adalah, ini adalah kelas sebelumnya dengan fitur yang diperluas. Itu berarti kelas baru ini adalah kelas lama dengan beberapa fitur tambahan. Misalkan Siswa adalah Siswa tetapi Semua Siswa adalah Manusia. Jadi ada hubungan dengan siswa dan manusia. Ini Warisan.
sumber
Tidak, keduanya berbeda. Komposisi mengikuti hubungan "HAS-A" dan pewarisan mengikuti hubungan "IS-A". Contoh terbaik untuk komposisi adalah pola Strategis.
sumber
Inheritence berarti menggunakan kembali fungsionalitas lengkap dari sebuah kelas, Di sini kelas saya harus menggunakan semua metode dari kelas super dan kelas saya akan digabungkan dengan kelas super dan kode akan diduplikasi di kedua kelas dalam hal pewarisan.
Tetapi kita dapat mengatasi semua masalah ini ketika kita menggunakan komposisi untuk berbicara dengan kelas lain. Komposisi mendeklarasikan atribut kelas lain ke kelas saya yang ingin kita bicarakan. dan fungsionalitas apa yang kita inginkan dari kelas itu yang bisa kita dapatkan dengan menggunakan atribut itu.
sumber