Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah anda boleh meniru kaedah mengatasi dalam Go tanpa sokongan langsung?

Bagaimanakah anda boleh meniru kaedah mengatasi dalam Go tanpa sokongan langsung?

Susan Sarandon
Susan Sarandonasal
2024-11-10 01:08:021016semak imbas

How can you emulate method overriding in Go without direct support?

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:

  1. Tentukan Antara Muka: Cipta antara muka bernama Getter yang mentakrifkan kaedah Get():
type Getter interface {
    Get() string
}
  1. Benamkan Antara Muka: Benamkan antara muka Getter dalam jenis Asas:
type Base struct {
    Getter
}

func (base *Base) Get() string {
    return "base"
}
  1. Tentukan Jenis Baharu: Cipta jenis baharu yang membenamkan jenis Asas dan melaksanakan antara muka Getter:
type Sub struct {
    Base
}

func (sub *Sub) Get() string {
    return "Sub"
}
  1. Panggil Kaedah Ganti: Dalam jenis Sub, panggil Get yang diganti ( ) menggunakan antara muka Getter dan lulus *Sub sebagai penerima:
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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn