Timpa Kaedah Go: Mencapai Gelagat Seperti Warisan
Dalam Go, kaedah mengatasi dalam pengertian pengaturcaraan berorientasikan objek tradisional tidak disokong secara langsung . Walau bagaimanapun, terdapat teknik yang membenarkan fungsi yang sama. Seseorang boleh memanfaatkan antara muka dan struct terbenam tanpa nama untuk mencontohi tingkah laku mengatasi kaedah.
Memahami Masalah
Pertimbangkan coretan kod berikut di mana kita mentakrifkan jenis asas Base dengan Get () kaedah dan kaedah GetName() yang hanya mengembalikan hasil Get().
type Base struct { } func (base *Base) Get() string { return "base" } func (base *Base) GetName() string { return base.Get() }
Matlamatnya adalah untuk mencipta jenis baharu yang mengatasi pelaksanaan Get() sambil mengekalkan kefungsian jenis Base sedia ada .
Menggunakan Pembenam Tanpa Nama
Satu pendekatan untuk meniru kaedah mengatasi ialah menggunakan pembenaman tanpa nama. Tentukan jenis baharu yang membenamkan jenis Pangkalan:
type Sub struct { Base } func (sub *Sub) Get() string { return "Sub" }
Kaedah ini tidak berfungsi kerana benaman tanpa nama pada asasnya ialah salinan jenis Pangkalan terbenam dan kaedah Get() baharu ditakrifkan pada yang berasingan copy.
Memanfaatkan Antara Muka dan Benam
Pendekatan Go yang lebih idiomatik untuk mencapai tingkah laku seperti warisan ialah menggunakan antara muka dan pembenaman. Begini cara kita boleh mencapainya:
type Getter interface { Get() string }
type Base struct { Getter } func (base *Base) Get() string { return "base" }
type Sub struct { Base } func (sub *Sub) Get() string { return "Sub" }
func (sub *Sub) GetName() string { return sub.Base.GetName(sub) }
Dengan menggunakan pendekatan ini, jenis Sub boleh mengatasi kaedah Get() sambil masih mengekalkan kefungsian penuh Base taip. Kaedah yang diganti boleh dipanggil secara eksplisit melalui antara muka Getter, memastikan penghantaran kaedah yang betul berdasarkan jenis penerima.
Atas ialah kandungan terperinci Bagaimanakah anda boleh meniru kaedah mengatasi dalam Go tanpa sokongan langsung?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!