Kadang-kadang saya telah menemukan lebih mudah untuk menjelaskan polimorfisme dengan ilustrasi. Sebuah ilustrasi mencoba untuk menyederhanakan dan pasti memiliki kekurangan, tetapi bisa membantu memperjelas ide. Asumsikan Mars datang ke bumi dan dia tahu tentang manusia, tetapi dia tidak tahu tentang perbedaan antara seorang pria dan seorang wanita. Dia sekarang mendekati manusia acak di jalan dan meminta pertanyaan yang sama, "Manusia, katakan apa yang Anda ingin lakukan". Asumsikan sekarang bahwa manusia pertama Mars mendekati dengan pertanyaan ini adalah Man. Untuk pergi dengan stereotip Barat, jawabannya bisa "Aku suka memancing". Sekarang menganggap itu mendekati Wanita dengan pertanyaan yang sama. Melanjutkan dengan stereotip, tanggapannya bisa "Aku suka belanja". Sejauh Mars yang melihatnya, tampak bahwa ia telah meminta hanya Manusia, tapi dia mendapat jawaban yang berbeda setiap kali. Jawabannya tergantung pada jenis sebenarnya dari orang yang ia tanya. Contoh konyol mungkin, tapi ini mirip dengan polimorfisme - di mana respon yang berbeda diperoleh dari jenis yang sama, dalam hal ini manusia, tergantung pada apa jenis tertentu itu.
Di Go, kita menggunakan antarmuka untuk mencapai polimorfisme ini. Untuk tutorial pemula pada antarmuka di Go, silahkan baca tutorial ini: Antarmuka di Go. Jika kita membuat sebuah antarmuka dan memiliki jenis lain mengimplementasikan antarmuka itu, maka kita dapat mencapai ke masing-masing jenis melalui metode yang didefinisikan antarmuka tanpa harus tahu apa jenis tertentu itu. Mari kita menerapkan itu dan melihat apa yang kita dapatkan.
kode lengkap
package main
import "fmt"
type Human interface {
myStereotype() string
}
type Man struct {
}
func (m Man) myStereotype() string {
return "I'm going fishing."
}
type Woman struct {
}
func (m Woman) myStereotype() string {
return "I'm going shopping."
}
func main() {
m := new (Man)
w := new (Woman)
// array Manusia - kita tidak tahu apakah Man atau Perempuan
hArr := [...]Human{m, w} // array 2 Manusia. Salah satunya adalah tipe manusia, satu adalah tipe Perempuan.
for n, _ := range (hArr) {
fmt.Println("I'm a human, and my stereotype is: ", hArr[n].myStereotype()) // muncul sebagai jenis manusia, tetapi perilaku berubah tergantung pada contoh aktual
}
}
I'm a human, and my stereotype is: I'm going fishing.
I'm a human, and my stereotype is: I'm going shopping.
I'm a human, and my stereotype is: I'm going shopping.
Dalam kode di atas dalam untuk loop, kita dapat meminta stereotip manusia, tetapi mendapatkan tanggapan yang berbeda setiap kali berdasarkan apa jenis intrinsik, baik pria atau wanita. Pada titik memanggil, kita hanya tahu bahwa itu adalah manusia - sehingga tampak bahwa manusia adalah morphing setiap kali. Di sana Anda pergi, polimorfisme!
Saya berharap bahwa contoh mudah untuk memahami dan menggambarkan konsep. Polimorfisme, setidaknya bagi saya, telah menjadi konsep yang sulit untuk menjelaskan, itulah sebabnya saya resor untuk contoh lebih mudah. Tapi jika Anda berpikir tentang hal ini, contoh di atas bisa dalam kenyataannya dilaksanakan seolah-olah pria dan wanita yang mewarisi dari Human. Jadi mari kita memperpanjang contoh sedikit lebih jauh.
Kami akan kali ini mengubah antarmuka ke Hobby. Kali ini kita akan memiliki Man and Woman berasal dari Manusia. Selain itu kami juga akan menambahkan Anjing yang tidak berasal dari jenis lainnya. Tapi kita akan memiliki masing-masing menerapkan Hobby antarmuka. Karena mereka melakukan itu, kita harus bisa memanggil myStereotype () metode pada semua dari mereka dan menerima hasil yang berbeda berdasarkan jenis intrinsik.
kode lengkap
package main import "fmt" type Hobby interface { myStereotype() string } type Human struct { } func (h Human) myStereotype() string { return "I'm a Human, only an abstract concept, and I can have no hobby." } type Man struct { Human // kelas anonim untuk mewarisi perilaku manusia } func (m Man) myStereotype() string { return "I'm a Man and I'm going fishing." } type Woman struct { Human // kelas anonim untuk mewarisi perilaku manusia } func (m Woman) myStereotype() string { return "I'm a Woman and I'm going shopping." } type Dog struct { // tidak mewarisi jenis lain } func (m Dog) myStereotype() string { return "bow bow bow, I'm chasing sticks." } func main() { h := new (Human) m := new (Man) w := new (Woman) d := new (Dog) // array contoh hobi - kita tidak perlu tahu apakah manusia atau anjing hobbyArr := [...]Hobby{h, m, w, d} //array of 3 Humans and 1 dog. for n, _ := range (hobbyArr ) { fmt.Println("My hobby? Well,", hobbyArr [n].myStereotype()) // muncul sebagai jenis Hobby, tetapi perubahan perilaku tergantung pada contoh aktual } }
My hobby? Well, I'm a Human, only an abstract concept, and I can have no hobby.
My hobby? Well, I'm a Man and I'm going fishing.
My hobby? Well, I'm a Woman and I'm going shopping.
My hobby? Well, bow bow bow, I'm chasing sticks.
My hobby? Well, I'm a Man and I'm going fishing.
My hobby? Well, I'm a Woman and I'm going shopping.
My hobby? Well, bow bow bow, I'm chasing sticks.
Tidak ada komentar:
Posting Komentar