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)
通过自动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语言提供的类型继承.