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
Lepaskan: 2024-11-10 01:08:02
asal
982 orang telah melayarinya

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()
}
Salin selepas log masuk

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"
}
Salin selepas log masuk
Salin selepas log masuk

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
}
Salin selepas log masuk
  1. Benamkan Antara Muka: Benamkan antara muka Getter dalam jenis Asas:
type Base struct {
    Getter
}

func (base *Base) Get() string {
    return "base"
}
Salin selepas log masuk
  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"
}
Salin selepas log masuk
Salin selepas log masuk
  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)
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan