Dalam Go Language Tutorial, mereka menjelaskan cara kerja antarmuka:
Go tidak memiliki kelas. Namun, Anda dapat menentukan metode pada tipe struct. The Metode penerima muncul dalam daftar argumen sendiri antara kata kunci func dan nama metode.
type Vertex struct {
X, Y float64
}
func (v *Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
Jenis antarmuka didefinisikan oleh serangkaian metode. Nilai tipe antarmuka dapat menampung nilai apa pun yang mengimplementasikan metode tersebut.
Ini adalah satu-satunya cara untuk membuat antarmuka di Go. Google selanjutnya menjelaskan bahwa:
Tipe mengimplementasikan antarmuka dengan mengimplementasikan metode. Tidak ada deklarasi niat yang eksplisit [yaitu
interface
deklarasi].Antarmuka implisit memisahkan paket implementasi dari paket yang mendefinisikan antarmuka: tidak tergantung pada yang lain.
Ini juga mendorong definisi antarmuka yang tepat, karena Anda tidak harus menemukan setiap implementasi dan menandainya dengan nama antarmuka yang baru.
Semua ini kedengarannya mencurigakan seperti Metode Ekstensi dalam C # , kecuali bahwa metode dalam Go adalah polimorfik tanpa ampun; mereka akan beroperasi pada semua jenis yang mengimplementasikannya.
Google mengklaim bahwa ini mendorong perkembangan yang cepat, tetapi mengapa? Apakah Anda melepaskan sesuatu dengan menjauh dari antarmuka eksplisit di C #? Bisakah Metode Ekstensi dalam C # memungkinkan seseorang untuk mendapatkan beberapa manfaat yang dimiliki antarmuka Go di C #?
sumber
Jawaban:
Saya tidak melihat metode ekstensi dan antarmuka implisit sebagai sama sekali.
Pertama mari kita bicara dengan tujuan.
Metode ekstensi ada sebagai gula sintaksis khusus untuk memberi Anda kemampuan untuk menggunakan metode seolah-olah itu anggota suatu objek, tanpa memiliki akses ke internal objek itu. Tanpa metode ekstensi Anda dapat melakukan hal yang persis sama, Anda hanya tidak mendapatkan sintaks yang menyenangkan
someObjectYouCantChange.YourMethod()
dan lebih baik harus meneleponYourMethod(someObjectYouCantChange)
.Tujuan dari antarmuka implisit adalah agar Anda dapat mengimplementasikan antarmuka pada objek yang tidak dapat Anda akses untuk berubah. Ini memberi Anda kemampuan untuk membuat hubungan polimorfik antara objek apa pun yang Anda tulis sendiri dan objek apa pun yang tidak memiliki akses ke internal.
Sekarang mari kita bicara konsekuensi.
Metode ekstensi benar-benar tidak punya, ini sangat sejalan dengan kendala keamanan yang kejam. NET mencoba untuk membantu dalam perspektif yang berbeda pada model (perspektif dari dalam, luar, pewaris, dan tetangga). Konsekuensinya hanyalah beberapa kesenangan sintaksis.
Konsekuensi dari antarmuka implisit adalah beberapa hal.
sumber
IEnumerable
danIQueryable
. Meskipun Anda bisa memalsukan ini denganstatic
metode di kelas utilitas, itu akan menjadi canggung.