代码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)
}
答案 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)
}
请注意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)
}