Cara Melaksanakan Berbilang Antara Muka dengan Tanda Tangan Kaedah Yang Sama dalam Pakej Berbeza
Andaikan anda perlu melaksanakan antara muka yang ditakrifkan dalam pakej berasingan dengan tandatangan kaedah yang bercanggah . Ini mungkin mencabar, tetapi Go menyediakan penyelesaian.
Mari kita pertimbangkan contoh:
Dalam pakej A:
package A type Doer interface { Do() string } func FuncA(doer A.Doer) { // Use doer.Do() here to implement functionality }
Dalam pakej B:
package B type Doer interface { Do() string } func FuncB(doer B.Doer) { // Use doer.Do() here to implement functionality }
Dalam pakej utama anda:
package main import ( "path/to/A" "path/to/B" ) type C int // C implements both A.Doer and B.Doer, but the implementation of Do() aligns with A. func (c C) Do() string { return "C implements both A and B" } func main() { c := C(0) A.FuncA(c) // Acceptable as C implements A.Doer B.FuncB(c) // Error, as the Do() implementation in C doesn't meet B.Doer requirements }
Penyelesaian:
Untuk menyelesaikan konflik ini, Go menawarkan pendekatan ringkas:
if _, ok := obj.(A.Doer); ok { }
Ini membolehkan anda mengesahkan sama ada objek (daripada jenis antara muka) mematuhi jenis antara muka lain (mis., A.Doer) pada masa jalan.
Walau bagaimanapun, OP menyerlahkan komplikasi selanjutnya: logik yang dilaksanakan untuk Do() dalam Pakej A dan Pakej B adalah berbeza. Untuk menangani perkara ini, buat pembalut di sekeliling objek anda:
Dengan melaksanakan pembalut yang berbeza, anda boleh mengawal kaedah yang hendak digunakan berdasarkan jenis antara muka yang dijangkakan (A.Doer atau B.Doer). Ini menghapuskan keperluan untuk satu kaedah Do() pada objek C asal, yang akan bergelut untuk melaksanakan kedua-dua logik.
Atas ialah kandungan terperinci Bagaimana untuk Mengendalikan Tandatangan Kaedah Bercanggah dalam Pelbagai Antara Muka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!