Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Mencapai Fungsi Mengatasi Kaedah dalam Go?

Bagaimana untuk Mencapai Fungsi Mengatasi Kaedah dalam Go?

Patricia Arquette
Lepaskan: 2024-11-22 14:04:32
asal
613 orang telah melayarinya

How to Achieve Method Overriding Functionality in Go?

Kaedah Overriding dalam Go

Dalam Go, tiada persamaan langsung dengan kaedah overriding seperti yang terdapat dalam bahasa berorientasikan objek seperti Java. Walau bagaimanapun, terdapat pendekatan alternatif untuk mencapai kefungsian yang sama.

Pertimbangkan senario di mana anda mempunyai jenis asas Base dengan kaedah Get() yang mengembalikan rentetan "base". Anda ingin menentukan Sub jenis baharu yang mewarisi daripada Base tetapi mempunyai pelaksanaan Get() berbeza yang mengembalikan "Sub".

Percubaan awal anda menggunakan komposisi seperti itu:

type Sub struct {
    Base
}

func(sub *Sub) Get() string {
    return "Sub"
}
Salin selepas log masuk

tidak akan berfungsi kerana kaedah Get() Sub tidak boleh mengatasi kaedah Get() Base. Ini disebabkan oleh semantik penerima kaedah Go, di mana jenis penerima (dalam kes ini *Base) menentukan kaedah yang akan dipanggil.

Menggunakan Antara Muka

Satu pendekatan alternatif ialah menggunakan antara muka. Antara muka mentakrifkan kontrak kaedah yang mesti dilaksanakan oleh jenis, serupa dengan kelas abstrak Java. Dalam kes ini, anda boleh mentakrifkan antara muka Getter dengan kaedah Get() tunggal.

type Getter interface {
    Get() string
}
Salin selepas log masuk

Anda kemudian boleh mengubah suai Base untuk melaksanakan antara muka Getter:

type Base struct {
}

func (base *Base) Get() string {
    return "base"
}
Salin selepas log masuk

Sekarang, anda boleh mentakrifkan Sub sebagai struct yang membenamkan contoh Base dan juga melaksanakan Getter:

type Sub struct {
    Base
}

func (sub *Sub) Get() string {
    return "Sub"
}
Salin selepas log masuk

Anda kemudian boleh menggunakan Kaedah GetName() untuk menentukan secara dinamik pelaksanaan Get() yang hendak dipanggil:

func (base *Base) GetName(getter Getter) string {
    if g, ok := getter.(Getter); ok {
        return g.Get()
    } else {
        return base.Get()
    }
}
Salin selepas log masuk

Dalam fungsi utama, anda boleh mencipta contoh Sub, menghantarnya ke Getter, dan kemudian menyerahkannya kepada GetName( ):

userType := Sub{}
fmt.Println(userType.GetName()) // prints "Sub"
Salin selepas log masuk

Pembenaman Kaedah

Alternatif lain ialah menggunakan kaedah pembenaman. Ini membolehkan anda menambah kaedah pada struct dengan membenamkan jenis yang melaksanakan kaedah tersebut. Dalam kes ini, anda boleh mentakrifkan jenis baharu SubGetter yang membenamkan Base dan melaksanakan kaedah Get() baharu:

type SubGetter struct {
    Base
}

func (sub *SubGetter) Get() string {
    return "Sub"
}
Salin selepas log masuk

Anda kemudiannya boleh menggunakan SubGetter sebagai kaedah Base:

type Base struct {
    SubGetter
}
Salin selepas log masuk

Ini membolehkan anda memanggil kaedah Get() SubGetter seolah-olah ia adalah kaedah Base:

base := Base{}
fmt.Println(base.Get()) // prints "Sub"
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Mencapai Fungsi Mengatasi Kaedah dalam Go?. 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