在golang中,我如何覆盖嵌入式struct的方法

wen*_*ner 2 polymorphism overriding proxy-classes go

代码在这里

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)
}
Run Code Online (Sandbox Code Playgroud)

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

更新

我希望当我调用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)
}
Run Code Online (Sandbox Code Playgroud)

cap*_*aig 5

通过自动Sub嵌入Base它,所有Base的字段和功能都可以作为顶级成员使用Sub.这意味着你可以直接打电话s.val,你能够调用s.Set调用基函数,除了对这一事实Sub都实现了自己Set的方法,其隐藏的基地之一.

当你打电话给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)
}
Run Code Online (Sandbox Code Playgroud)

播放链接

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