Saya dihadapkan dengan pertanyaan ini di akhir ujian buku terbuka modul hari ini dan ternyata saya tersesat. Saya sedang membacaHead first Java
dan kedua definisi itu tampaknya persis sama. Saya hanya ingin tahu apa perbedaan UTAMA untuk pikiran saya sendiri. Saya tahu ada sejumlah pertanyaan serupa untuk ini tetapi, tidak ada yang saya lihat yang memberikan jawaban pasti.
java
oop
inheritance
polymorphism
Darren Burgess
sumber
sumber
Jawaban:
Warisan adalah ketika 'kelas' berasal dari 'kelas' yang ada. Jadi, jika Anda memiliki
Person
kelas, maka Anda memilikiStudent
kelas yang meluasPerson
,Student
mewarisi semua hal yangPerson
dimiliki. Ada beberapa detail di sekitar pengubah akses yang Anda letakkan di bidang / metode di Person, tapi itu ide dasarnya. Misalnya, jika Anda memiliki bidang pribadi diPerson
,Student
tidak akan melihatnya karena bidang pribadi, dan pribadi tidak terlihat oleh subclass.Polimorfisme berkaitan dengan bagaimana program memutuskan metode mana yang harus digunakan, tergantung pada jenis benda apa yang dimilikinya. Jika Anda memiliki
Person
, yang memilikiread
metode, dan Anda memilikiStudent
yang meluasPerson
, yang memiliki implementasi sendiriread
, metode mana yang dipanggil ditentukan untuk Anda oleh runtime, tergantung apakah Anda memilikiPerson
atauStudent
. Agak sulit, tetapi jika Anda melakukan sesuatu sepertimetode baca pada Siswa dipanggil. Itulah polimorfisme yang sedang beraksi. Anda dapat melakukan tugas itu karena a
Student
adalahPerson
, tetapi runtime cukup pintar untuk mengetahui tipe sebenarnya darip
adalah Siswa .Perhatikan bahwa detail berbeda di antara bahasa. Anda dapat melakukan pewarisan dalam javascript misalnya, tetapi sama sekali berbeda dari cara kerjanya di Jawa.
sumber
Person
'sread
metode menggunakan akses pengubah publik, tidak akanStudent
benda dapat mengakses mereka? danStudent s = new Student();
bukankah itu akan lebih mudah? Saya masih belum benar-benar mendapatkan manfaat dari Polymporphism sebenarnya.Person p = new Student();
bukanStudent p = new Student();
?Inheritance mengacu pada penggunaan struktur dan perilaku kelas super dalam subkelas.
Polimorfisme mengacu pada mengubah perilaku kelas super di subkelas.
sumber
m
(keduanyastatic
daninstance
) dari superclass yang ..." (diikuti dengan perincian tentang pewarisan). Kedengarannya seperti "code reuse" bagi saya.import static
untuk menghilangkan penyalahgunaan antarmuka.) Untuk polimorfisme murni di Jawa, alat yang digunakan adalah antarmuka, bukan warisan kelas.Polimorfisme : Kemampuan untuk memperlakukan objek dari berbagai jenis dengan cara yang serupa. Contoh: Jerapah dan Buaya adalah Hewan, dan hewan juga bisa
Move
. Jika Anda memiliki instance dariAnimal
maka Anda dapat memanggilMove
tanpa mengetahui atau peduli apa jenis binatang itu.Warisan : Ini adalah salah satu cara untuk mencapai Polimorfisme dan penggunaan kembali kode secara bersamaan.
Bentuk lain dari polimorfisme : Ada cara lain untuk mencapai polimorfisme, seperti antarmuka, yang hanya menyediakan polimorfisme tetapi tidak ada kode yang digunakan kembali (kadang-kadang kode sangat berbeda, seperti
Move
untuk Ular akan sangat berbeda dariMove
untuk Anjing, dalam hal ini sebuah Antarmuka akan menjadi pilihan polimorfik yang lebih baik dalam kasus ini.Dalam bahasa dinamis lain, polimorfisme dapat dicapai dengan Duck Typing, yaitu kelas-kelas yang bahkan tidak perlu berbagi kelas dasar atau antarmuka yang sama, mereka hanya perlu metode dengan nama yang sama. Atau bahkan lebih dinamis seperti Javascript, Anda bahkan tidak perlu kelas sama sekali, hanya sebuah objek dengan nama metode yang sama dapat digunakan secara polimorfik.
sumber
Perbedaan utama adalah polimorfisme adalah hasil khusus dari pewarisan. Polimorfisme adalah di mana metode yang akan dipanggil ditentukan pada saat runtime berdasarkan pada jenis objek. Ini adalah situasi yang terjadi ketika Anda memiliki satu kelas yang diwarisi dari yang lain dan mengganti metode tertentu. Namun, dalam pohon pewarisan normal, Anda tidak perlu mengganti metode apa pun dan karenanya tidak semua pemanggilan metode harus polimorfik. Apakah itu masuk akal? Ini masalah yang sama dengan semua kendaraan Ford adalah mobil, tetapi tidak semua mobil Ford (walaupun tidak cukup ....).
Selain itu, polimorfisme berkaitan dengan pemanggilan metode sedangkan pewarisan juga menggambarkan anggota data, dll.
sumber
Di Jawa, keduanya terkait erat. Ini karena Java menggunakan teknik untuk pemanggilan metode yang disebut "pengiriman dinamis". Jika saya punya
Kemudian kita melihat bahwa B mewarisi
spin
dari A. Namun, ketika kita mencoba memanipulasi objek seolah-olah itu tipe A, kita masih mendapatkan perilaku B untukdraw
. Itudraw
perilaku polimorfik.Dalam beberapa bahasa, polimorfisme dan pewarisan tidak begitu erat hubungannya. Dalam C ++, misalnya, fungsi yang tidak dideklarasikan virtual diwariskan, tetapi tidak akan dikirim secara dinamis, jadi Anda tidak akan mendapatkan perilaku polimorfik itu bahkan ketika Anda menggunakan warisan.
Dalam javascript, setiap panggilan fungsi dikirim secara dinamis dan Anda memiliki ketikan yang lemah. Ini berarti Anda dapat memiliki banyak objek yang tidak terkait, masing-masing dengan miliknya sendiri
draw
, memiliki fungsi yang berulang di atasnya dan memanggil fungsi tersebut, dan masing-masing akan berperilaku baik-baik saja. Anda akan memiliki undian polimorfik Anda sendiri tanpa membutuhkan warisan.sumber
Polimorfisme: Misalkan Anda bekerja di perusahaan yang menjual pena. Jadi Anda membuat kelas yang sangat bagus yang disebut "Pena" yang menangani semua yang perlu Anda ketahui tentang pena. Anda menulis semua jenis kelas untuk penagihan, pengiriman, pembuatan faktur, semua menggunakan kelas Pena. Seorang bos datang dan berkata, "Berita bagus! Perusahaan ini berkembang dan kami menjual Buku & CD sekarang!" Bukan berita bagus karena sekarang Anda harus mengubah setiap kelas yang menggunakan Pena untuk juga menggunakan Buku & CD. Tetapi bagaimana jika Anda awalnya membuat antarmuka yang disebut "SellableProduct", dan Pen mengimplementasikan antarmuka ini. Maka Anda bisa menulis semua pengiriman, faktur, dll. Kelas untuk menggunakan antarmuka itu, bukan Pen. Sekarang yang harus Anda lakukan adalah membuat kelas baru bernama Book & CompactDisc yang mengimplementasikan antarmuka SellableProduct. Karena polimorfisme, semua kelas lain dapat terus bekerja tanpa perubahan! Masuk akal?
Jadi, itu berarti menggunakan Warisan yang merupakan salah satu cara untuk mencapai polimorfisme.
Polimorfisme dapat dimungkinkan dalam suatu kelas / antarmuka tetapi Warisan selalu di antara 2 atau lebih kelas / antarmuka. Warisan selalu sesuai dengan hubungan "is-a" sedangkan itu tidak selalu dengan Polymorphism (yang dapat menyesuaikan keduanya "is-a" / "has-a".
sumber
Warisan lebih merupakan hal yang statis (satu kelas memperluas yang lain) sementara polimorfisme adalah hal yang dinamis / runtime (objek berperilaku sesuai dengan tipe dinamis / runtime bukan tipe statis / deklarasi).
Misalnya
-> Meskipun tipe statik / deklarasi a adalah A, tipe dinamis / runtime aktual adalah B dan karenanya a.foo () akan menjalankan foo sebagaimana didefinisikan dalam B bukan dalam A.
sumber
Polimorfisme adalah suatu pendekatan untuk mengekspresikan perilaku umum antara jenis-jenis objek yang memiliki sifat yang sama. Hal ini juga memungkinkan variasi sifat-sifat tersebut dibuat melalui penggantian. Warisan adalah cara untuk mencapai polimorfisme melalui hierarki objek di mana objek mengekspresikan hubungan dan perilaku abstrak. Ini bukan satu-satunya cara untuk mencapai polimorfisme. Prototipe adalah cara lain untuk mengekspresikan polimorfisme yang berbeda dari warisan. JavaScript adalah contoh bahasa yang menggunakan prototipe. Saya membayangkan ada cara lain juga.
sumber
Warisan adalah konsep yang terkait dengan penggunaan kembali kode. Sebagai contoh jika saya memiliki kelas induk katakan
Animal
dan berisi atribut dan metode tertentu (untuk contoh ini katakanmakeNoise()
dansleep()
) dan saya membuat dua kelas anak yang disebutDog
danCat
. Karena kedua anjing dan kucing tidur dengan cara yang sama (saya akan berasumsi), tidak perlu menambahkan lebih banyak fungsionalitas kesleep()
metode dalamDog
danCat
subkelas yang disediakan oleh kelas indukAnimal
. Namun,Dog
gonggongan danCat
mengeong jadi meskipunAnimal
kelas mungkin memiliki metode untuk membuat suara, anjing dan kucing membuat suara yang berbeda relatif satu sama lain dan hewan lainnya. Dengan demikian, ada kebutuhan untuk mendefinisikan kembali perilaku itu untuk tipe spesifik mereka. Demikianlah definisi polimorfisme. Semoga ini membantu.sumber
Dokumentasi Oracle mengutip perbedaannya dengan tepat.
inheritance: Kelas mewarisi bidang dan metode dari semua superclasses, baik langsung atau tidak langsung. Subclass dapat menimpa metode yang diwarisi, atau dapat menyembunyikan bidang atau metode yang diwarisi . (Perhatikan bahwa menyembunyikan bidang umumnya merupakan praktik pemrograman yang buruk.)
polimorfisme: polimorfisme mengacu pada prinsip dalam biologi di mana suatu organisme atau spesies dapat memiliki berbagai bentuk atau tahapan. Prinsip ini juga dapat diterapkan pada pemrograman dan bahasa berorientasi objek seperti bahasa Java. Subclass dari suatu kelas dapat mendefinisikan perilaku unik mereka sendiri dan berbagi fungsi yang sama dari kelas induknya.
polimorfisme tidak berlaku untuk bidang.
Posting terkait:
Polimorfisme vs Overriding vs Overloading
sumber
Polimorfisme adalah efek dari warisan . Itu hanya bisa terjadi di kelas yang saling memperpanjang. Hal ini memungkinkan Anda untuk memanggil metode kelas tanpa mengetahui jenis kelas yang tepat. Juga, polimorfisme memang terjadi pada saat run time .
Misalnya, contoh polimorfisme Java:
Warisan memungkinkan kelas turunan berbagi antarmuka dan kode kelas dasar mereka. Itu terjadi pada waktu kompilasi .
Misalnya, Semua Kelas di Platform Java adalah Keturunan Objek (image courtesy Oracle):
Untuk mempelajari lebih lanjut tentang pewarisan Java dan polimorfisme Java
sumber
Warisan adalah ketika kelas A mewarisi semua metode / bidang nonstatis yang dilindungi / dari semua orang tuanya hingga Object.
sumber
Jika Anda menggunakan JAVA, sesederhana ini:
Polimorfisme menggunakan metode yang diwariskan tetapi "Mengesampingkan" mereka untuk melakukan sesuatu yang berbeda (atau sama jika Anda memanggil super sehingga secara teknis tidak akan menjadi polimorfik).
Koreksi saya jika saya salah.
sumber
Tujuan utama polimorfisme : Untuk membuat variabel referensi ke kelas super dan memegang objek subclass => suatu objek dapat melakukan banyak perilaku .
Dalam pewarisan , subkelas mewarisi sifat-sifat kelas super .
sumber
Warisan adalah jenis polimorfisme, Tepatnya sebenarnya pewarisan adalah polimorfisme dinamis. Jadi, ketika Anda menghapus warisan Anda tidak bisa menimpa lagi.
sumber
Dengan Inheritance , implementasinya didefinisikan dalam superclass - sehingga perilaku diwarisi.
Dengan Polymorphism , implementasinya didefinisikan dalam subclass - jadi hanya antarmuka yang diwarisi.
sumber
Polimorfisme dicapai oleh Pewarisan di
Java
.Hamster
kelas mewarisi struktur dariAnimal
,Herbivore
danPet
untuk menunjukkan behaviorisme Polimorfik hewan peliharaan.Cat
kelas mewarisi struktur dariAnimal
,Carnivore
danPet
juga menunjukkan behaviorisme Polimorfik hewan peliharaan.sumber