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

时间:2015-04-18 04:31:12

标签: go polymorphism override proxy-classes

代码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)
}

2 个答案:

答案 0 :(得分:5)

通过Sub嵌入Base,{@ 1}}会自动将所有Base的字段和功能作为Sub的顶级成员提供。这意味着您可以直接拨打s.val 可以调用s.Set来调用基本函数,但除外{{1>} Sub 1}}实现了自己的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()类型继承感很像。

答案 1 :(得分:0)

我想我应该在这里使用界面,它实现了我想要的,但影响了基础

func main() {
    t16()
}

type Base interface {
    Set(int)
}
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.Set(1)
    var b Base = s
    fmt.Printf("%+v\n", b)
    fmt.Printf("%+v\n", s)
}