gpt4 book ai didi

go - 在 golang 中,如何覆盖嵌入式结构的方法

转载 作者:IT王子 更新时间:2023-10-29 01:33:36 26 4
gpt4 key购买 nike

代码 here

package main

import "fmt"

func main() {
t16()
}

type Base struct {
val int
}
func (b *Base)Set(i int) {
b.val = i
}
type Sub struct {
Base
changed bool
}

func (b *Sub)Set(i int) {
b.val = i
b.changed = true
}
func t16() {
s := &Sub{}
s.Base.Set(1)
var b *Base = &s.Base
fmt.Printf("%+v\n", b)
fmt.Printf("%+v\n", s)
}

我想让 Sub 充当 Base,但是当我调用 Set 时,对于 Sub 它将标记已更改。我知道 golang 中没有多态或代理,但是有什么办法可以做到这一点,而不影响基地?

已更新

我希望当我调用 Base.Set 时它会标记更改,对于用户来说,他们不知道他们实际上使用了 Sub,所以我可以监视 Base 的行为。

func t16() {
s := &Sub{}
var b *Base = &s.Base
b.Set(10)
fmt.Printf("%+v\n", b)
fmt.Printf("%+v\n", s)
}

最佳答案

通过让 Sub 嵌入 Base,它会自动将 Base 的所有字段和函数作为 的顶级成员提供子。这意味着您可以直接调用 s.val,并且您能够调用 s.Set 来调用基函数 except 因为 Sub 实现了自己的 Set 方法,该方法隐藏 Base 方法。

当您在示例中调用 s.Base.Set() 时,您将绕过 Sub.Set() 并直接调用 Base.Set().

要解决您的问题,只需调用 s.Set() 而不是 s.Base.Set() 即可。

这对我有用:

func (b *Sub)Set(i int) {
b.Base.Set(i)
b.changed = true
}
func t16() {
s := &Sub{}
s.Set(1)
var b *Base = &s.Base
fmt.Printf("%+v\n", b)
fmt.Printf("%+v\n", s)
}

Play link

注意 Sub.Set() 也可以调用嵌入的结构方法,这感觉很像其他 oo 语言提供的 super() 类型继承。

关于go - 在 golang 中,如何覆盖嵌入式结构的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29712909/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com