Dalam hal Jawa, ketika seseorang bertanya:
apa itu polimorfisme?
Apakah overloading atau overriding menjadi jawaban yang bisa diterima?
Saya pikir ada sedikit lebih dari itu.
JIKA Anda memiliki kelas dasar abstrak yang mendefinisikan metode tanpa implementasi, dan Anda mendefinisikan metode itu dalam sub kelas, apakah itu masih menimpa?
Saya pikir overloading bukanlah jawaban yang tepat.
java
oop
polymorphism
overloading
overriding
Brian G
sumber
sumber
Jawaban:
Cara paling jelas untuk mengekspresikan polimorfisme adalah melalui kelas dasar abstrak (atau antarmuka)
Kelas ini abstrak karena
goPee()
metode ini tidak dapat didefinisikan untuk Manusia. Ini hanya dapat didefinisikan untuk subclass Pria dan Wanita. Juga, Manusia adalah konsep abstrak - Anda tidak dapat membuat manusia yang bukan Pria atau Wanita. Pasti satu atau yang lain.Jadi kami menunda implementasi dengan menggunakan kelas abstrak.
dan
Sekarang kita bisa memberi tahu seluruh ruangan yang penuh dengan Manusia untuk buang air kecil.
Menjalankan ini akan menghasilkan:
sumber
goPee
tidak mengambil medan gravitasi sebagai input. Ketergantungan pada keadaan global ini membuat pengujian unit menjadiCatheterizedIntersexAstronaut
sulit, dan menunjukkan bahwa subklas mungkin tidak selalu menjadi metode terbaik untuk komposisi sifat.Polimorfisme adalah kemampuan instance kelas untuk berperilaku seolah-olah itu adalah instance dari kelas lain dalam pohon warisannya, paling sering salah satu kelas leluhurnya. Sebagai contoh, di Jawa semua kelas mewarisi dari Objek. Oleh karena itu, Anda dapat membuat variabel tipe objek dan menetapkan untuk itu instance kelas apa pun.
Sebuah overrideadalah jenis fungsi yang terjadi di kelas yang mewarisi dari kelas lain. Fungsi override "menggantikan" fungsi yang diwarisi dari kelas dasar, tetapi melakukannya sedemikian rupa sehingga disebut bahkan ketika turunan kelasnya berpura-pura menjadi tipe yang berbeda melalui polimorfisme. Mengacu pada contoh sebelumnya, Anda bisa mendefinisikan kelas Anda sendiri dan mengabaikan fungsi toString (). Karena fungsi ini diwarisi dari Object, itu masih akan tersedia jika Anda menyalin turunan kelas ini ke variabel tipe objek. Biasanya, jika Anda memanggil toString () di kelas Anda saat itu berpura-pura menjadi Obyek, versi toString yang sebenarnya akan diaktifkan adalah yang didefinisikan pada Object itu sendiri. Namun, karena fungsi ini menimpa, definisi toString () dari kelas Anda digunakan bahkan ketika instance kelas '
Overloading adalah tindakan mendefinisikan banyak metode dengan nama yang sama, tetapi dengan parameter yang berbeda. Ini tidak terkait dengan override atau polimorfisme.
sumber
Ad hoc polymorphism
adalah apa yang Anda jelaskan di bagian Overloading Anda dan merupakan kasus polimorfisme.Polimorfisme berarti lebih dari satu bentuk, objek yang sama melakukan operasi yang berbeda sesuai dengan kebutuhan.
Polimorfisme dapat dicapai dengan menggunakan dua cara, yaitu
Metode overloading berarti menulis dua atau lebih metode dalam kelas yang sama dengan menggunakan nama metode yang sama, tetapi parameter kelulusannya berbeda.
Metode overriding berarti kita menggunakan nama metode di kelas yang berbeda, itu berarti metode kelas induk digunakan di kelas anak.
Di Jawa untuk mencapai polimorfisme variabel referensi kelas super dapat menampung objek sub kelas.
Untuk mencapai polimorfisme, setiap pengembang harus menggunakan nama metode yang sama dalam proyek.
sumber
Berikut adalah contoh polimorfisme di pseudo-C # / Java:
Fungsi utama tidak tahu jenis hewan dan tergantung pada perilaku implementasi tertentu dari metode MakeNoise ().
Sunting: Sepertinya Brian memukul saya sampai habis. Lucu kami menggunakan contoh yang sama. Tetapi kode di atas harus membantu memperjelas konsep.
sumber
Baik overriding maupun overloading digunakan untuk mencapai polimorfisme.
Anda bisa memiliki metode dalam kelas yang ditimpa dalam satu atau beberapa subclass. Metode ini melakukan hal yang berbeda tergantung pada kelas mana yang digunakan untuk instantiate objek.
Anda juga bisa memiliki metode yang kelebihan muatan dengan dua atau lebih set argumen. Metode ini melakukan hal-hal yang berbeda berdasarkan jenis argumen yang diteruskan.
sumber
Anda benar bahwa overloading bukan jawabannya.
Tidak ada yang mengesampingkan. Mengesampingkan adalah cara Anda mendapatkan polimorfisme. Polimorfisme adalah kemampuan suatu objek untuk memvariasikan perilaku berdasarkan jenisnya. Ini paling baik ditunjukkan ketika penelepon objek yang menunjukkan polimorfisme tidak mengetahui tipe spesifik objek tersebut.
sumber
Secara khusus mengatakan overloading atau override tidak memberikan gambaran lengkap. Polimorfisme hanyalah kemampuan suatu objek untuk mengkhususkan perilakunya berdasarkan jenisnya.
Saya tidak setuju dengan beberapa jawaban di sini bahwa overloading adalah bentuk polimorfisme (parametrik polimorfisme) dalam hal suatu metode dengan nama yang sama dapat berperilaku berbeda memberikan jenis parameter yang berbeda. Contoh yang bagus adalah kelebihan operator. Anda dapat mendefinisikan "+" untuk menerima berbagai jenis parameter - misalnya string atau int - dan berdasarkan pada tipe-tipe itu, "+" akan berperilaku berbeda.
Polimorfisme juga mencakup metode pewarisan dan pengesampingan, meskipun mereka bisa abstrak atau virtual dalam tipe dasarnya. Dalam hal polimorfisme berbasis pewarisan, Java hanya mendukung pewarisan kelas tunggal yang membatasi perilaku polimorfiknya dengan rantai jenis dasar tunggal. Java mendukung implementasi beberapa antarmuka yang merupakan bentuk lain dari perilaku polimorfik.
sumber
Polimorfisme berarti "Banyak Bentuk".
Itu tidak MEMERLUKAN warisan untuk mencapai ... karena implementasi antarmuka, yang sama sekali bukan warisan, melayani kebutuhan polimorfik. Bisa dibilang, implementasi antarmuka melayani kebutuhan polimorfik "Lebih baik" daripada warisan.
Misalnya, apakah Anda akan membuat kelas super untuk menggambarkan semua hal yang dapat terbang? Saya pikir tidak. Anda akan lebih baik dilayani untuk membuat antarmuka yang menggambarkan penerbangan dan biarkan begitu saja.
Jadi, karena antarmuka menggambarkan perilaku, dan nama metode menggambarkan perilaku (kepada programmer), tidak terlalu jauh untuk mempertimbangkan metode kelebihan beban sebagai bentuk polimorfisme yang lebih rendah.
sumber
Contoh klasik, Anjing dan kucing adalah hewan, hewan memiliki metode makeNoise. Saya bisa mengulangi melalui array hewan memanggil makeNoise pada mereka dan berharap bahwa mereka akan melakukan implementasi masing-masing di sana.
Kode panggilan tidak harus tahu binatang apa itu.
Itulah yang saya anggap sebagai polimorfisme.
sumber
Polimorfisme adalah kemampuan suatu objek muncul dalam berbagai bentuk. Ini melibatkan penggunaan fungsi warisan dan virtual untuk membangun sekumpulan objek yang dapat dipertukarkan. Kelas dasar berisi prototipe dari fungsi-fungsi virtual, mungkin tidak diimplementasikan atau dengan implementasi standar sebagai dikte aplikasi, dan berbagai kelas turunan masing-masing mengimplementasikannya secara berbeda untuk mempengaruhi perilaku yang berbeda.
sumber
Tidak ada:
Overloading adalah ketika Anda memiliki nama fungsi yang sama yang mengambil parameter berbeda.
Overriding adalah ketika kelas anak mengganti metode orang tua dengan salah satu metode sendiri (ini sendiri bukan merupakan polimorfisme).
Polimorfisme terlambat mengikat, misalnya metode kelas dasar (induk) dipanggil tetapi tidak sampai runtime aplikasi mengetahui objek sebenarnya - mungkin kelas anak yang metodenya berbeda. Ini karena setiap kelas anak dapat digunakan di mana kelas dasar didefinisikan.
Di Jawa Anda sering melihat polimorfisme dengan perpustakaan koleksi:
Daftar adalah kelas dasar, kompiler tidak memiliki petunjuk jika Anda menghitung daftar tertaut, vektor, array, atau implementasi daftar kustom, asalkan bertindak seperti Daftar:
Jika Anda kelebihan beban, Anda harus:
dan versi countStuff () yang benar akan dipilih oleh kompiler agar sesuai dengan parameter.
sumber
Meskipun, Polimorfisme sudah dijelaskan dengan sangat rinci dalam posting ini tetapi saya ingin lebih menekankan mengapa bagian dari itu.
Mari kita coba membangun aplikasi sederhana untuk TV dengan dan tanpa Warisan / Polimorfisme. Posting setiap versi aplikasi, kami melakukan retrospektif kecil.
Seandainya, Anda adalah seorang insinyur perangkat lunak di sebuah perusahaan TV dan Anda diminta untuk menulis perangkat lunak untuk pengontrol Volume, Brightness dan Color untuk menambah dan mengurangi nilainya pada perintah pengguna.
Anda mulai dengan menulis kelas untuk masing-masing fitur ini dengan menambahkan
Sekarang Anda memiliki versi pertama aplikasi kerja kami yang siap untuk digunakan. Waktu untuk menganalisis pekerjaan yang dilakukan sejauh ini.
Anda memutuskan untuk hidup dengan itu selama aplikasi Anda berfungsi seperti yang diharapkan.
Anda mulai menulis kelas baru (ResetFunctionV2) untuk fungsionalitas baru dan memetakan kode pemetaan input pengguna untuk fitur baru ini.
Jadi, Anda sudah menyiapkan aplikasi dengan fitur Reset. Tapi, sekarang Anda mulai menyadarinya
Sekarang Anda mulai berpikir bahwa fitur baru yang akan ditambahkan ini menyerupai fitur Reset dan Issue of Application (V2) akan dikalikan jika Anda tidak memasukkan kembali faktor aplikasi Anda.
Anda mulai berpikir untuk menggunakan warisan sehingga Anda dapat mengambil keuntungan dari kemampuan polimorfik JAVA dan Anda menambahkan kelas abstrak baru (ControllerV3) ke
Dengan peningkatan ini, Anda memiliki versi 3 aplikasi TV Anda siap dengan Anda.
Meskipun sebagian besar Masalah yang tercantum dalam daftar masalah V2 ditangani kecuali
Sekali lagi, Anda berpikir untuk menyelesaikan masalah ini, karena sekarang Anda memiliki fitur lain (pembaruan driver saat startup) untuk diterapkan juga. Jika Anda tidak memperbaikinya, itu akan direplikasi ke fitur baru juga.
Jadi Anda membagi kontrak yang didefinisikan dalam kelas abstrak dan menulis 2 antarmuka untuk
Dan mintalah kelas beton 1 Anda mengimplementasikannya seperti di bawah ini
Semoga ini membantu :-)
sumber
Istilah overloading mengacu pada memiliki beberapa versi sesuatu dengan nama yang sama, biasanya metode dengan daftar parameter yang berbeda
Jadi fungsi-fungsi ini mungkin melakukan hal yang sama tetapi Anda memiliki opsi untuk menyebutnya dengan ID, atau nama. Tidak ada hubungannya dengan warisan, kelas abstrak, dll.
Overriding biasanya merujuk pada polimorfisme, seperti yang Anda jelaskan dalam pertanyaan Anda
sumber
overloading adalah ketika Anda mendefinisikan 2 metode dengan nama yang sama tetapi parameter yang berbeda
overriding adalah tempat Anda mengubah perilaku kelas dasar melalui fungsi dengan nama yang sama di subkelas.
Jadi Polimorfisme terkait dengan mengesampingkan tetapi tidak terlalu berlebihan.
Namun, jika seseorang memberi saya jawaban sederhana "penggantian" untuk pertanyaan "Apa itu polimorfisme?" Saya akan meminta penjelasan lebih lanjut.
sumber
overriding lebih seperti menyembunyikan metode yang diwariskan dengan mendeklarasikan metode dengan nama dan tanda tangan yang sama dengan metode tingkat atas (metode super), ini menambahkan perilaku polimorfik ke kelas. dengan kata lain keputusan untuk memilih metode level mana yang akan dipanggil akan dibuat pada saat run time bukan pada waktu kompilasi. ini mengarah pada konsep antarmuka dan implementasi.
sumber
Dari tutorial java
Definisi kamus polimorfisme mengacu pada prinsip dalam biologi di mana organisme atau spesies dapat memiliki berbagai bentuk atau tahapan. Prinsip ini juga dapat diterapkan pada pemrograman dan bahasa berorientasi objek seperti bahasa Java. Subkelas kelas dapat menentukan perilaku unik mereka sendiri dan berbagi fungsi yang sama dari kelas induk.
Dengan mempertimbangkan contoh dan definisi, jawaban utama harus diterima.
Mengenai permintaan kedua Anda:
Itu harus disebut overriding.
Lihat contoh ini untuk memahami berbagai jenis pengesampingan.
super.methodName()
sebagai pernyataan pertamacuplikan kode:
keluaran:
sumber
Saya pikir kalian adalah konsep campuran. Polimorfisme adalah kemampuan suatu objek untuk berperilaku berbeda pada saat run time. Untuk mencapai ini, Anda perlu dua syarat:
Setelah mengatakan bahwa overloading berarti sesuatu yang berbeda untuk mengesampingkan tergantung pada bahasa yang Anda gunakan. Misalnya di Java tidak ada overriding tetapi overloading . Metode kelebihan beban dengan tanda tangan yang berbeda dengan kelas dasarnya tersedia di subkelas. Kalau tidak, mereka akan diganti (tolong, lihat yang saya maksud sekarang fakta tidak ada cara untuk memanggil metode kelas dasar Anda dari luar objek).
Namun dalam C ++ tidak demikian. Setiap kelebihan beban metode, secara independen apakah tanda tangan adalah (jumlah diffrrent, jenis yang berbeda) yang sama atau tidak juga diganti . Itu untuk hari ini, metode kelas dasar 'tidak lagi tersedia di subclass ketika dipanggil dari luar objek subclass, jelas.
Jadi jawabannya adalah ketika berbicara tentang Java menggunakan overloading . Dalam bahasa lain mungkin berbeda seperti yang terjadi di c ++
sumber
Polimorfisme lebih mungkin sejauh artinya terkait ... TERLALU di Jawa
Ini semua tentang perilaku yang berbeda dari objek SAMA dalam situasi yang berbeda (Dengan cara pemrograman ... Anda dapat memanggil ARGUMEN yang berbeda)
Saya pikir contoh di bawah ini akan membantu Anda untuk memahami ... Meskipun bukan kode java MURNI ...
Tetapi jika kita mengubah ARGUMENT ... PERILAKU akan diubah ...
Orang (di sini "Objek") sama ...
sumber
Polimorfisme adalah implementasi beberapa objek atau Anda bisa mengatakan beberapa bentuk objek. katakanlah Anda memiliki kelas
Animals
sebagai kelas dasar abstrak dan memiliki metode yang disebutmovement()
yang mendefinisikan cara hewan bergerak. Sekarang pada kenyataannya kita memiliki berbagai jenis hewan dan mereka bergerak secara berbeda juga beberapa dari mereka dengan 2 kaki, yang lain dengan 4 dan beberapa tanpa kaki, dll. Untuk mendefinisikan berbedamovement()
dari setiap hewan di bumi, kita perlu menerapkan polimorfisme. Namun, Anda perlu mendefinisikan lebih banyak kelas yaitu kelasDogs
Cats
Fish
dll. Kemudian Anda perlu memperluas kelas-kelas tersebut dari kelas dasarAnimals
dan mengganti metodenyamovement()
dengan fungsionalitas gerakan baru berdasarkan pada masing-masing hewan yang Anda miliki. Anda juga bisa menggunakanInterfaces
untuk mencapai itu. Kata kunci di sini menimpa, overload berbeda dan tidak dianggap sebagai polimorfisme. dengan overloading Anda dapat mendefinisikan beberapa metode "dengan nama yang sama" tetapi dengan parameter yang berbeda pada objek atau kelas yang sama.sumber
Polimorfisme berhubungan dengan kemampuan suatu bahasa untuk memiliki objek yang berbeda diperlakukan secara seragam dengan menggunakan antarmuka tunggal; karena itu terkait dengan penggantian, sehingga antarmuka (atau kelas dasar) adalah polimorfik, implementor adalah objek yang menimpa (dua wajah dari medali yang sama)
Lagi pula, perbedaan antara dua istilah lebih baik dijelaskan menggunakan bahasa lain, seperti c ++: objek polimorfik dalam c ++ berperilaku sebagai mitra java jika fungsi dasar adalah virtual, tetapi jika metode ini bukan virtual lompatan kode diselesaikan secara statis , dan tipe sebenarnya tidak dicentang pada saat runtime demikian, polimorfisme mencakup kemampuan suatu objek untuk berperilaku berbeda tergantung pada antarmuka yang digunakan untuk mengaksesnya; izinkan saya membuat contoh di pseudocode:
(Andaikan makeRumor BUKAN virtual)
java tidak benar-benar menawarkan tingkat polimorfisme ini (disebut juga pemotongan objek).
hewan a = anjing baru (); anjing b = anjing baru ();
pada kedua kasus itu hanya akan mencetak woff .. karena a dan b mengacu pada anjing kelas
sumber
sumber