假设我在Go中有以下代码:Go Playground
我有一个Base
结构和一个Sub
结构,并想覆盖Base
结构(innerDo()
)中的函数。
通过使用x = &Sub{&Base{}}
,Sub实例x
拥有Base
的所有方法,调用x.InnerDo()
将采用Sub对该函数的实现。但是,如果使用x.OuterDo()
进行传递调用后又调用x.InnerDo()
,则使用Base
的功能。
如果我无法控制Base
的代码并想覆盖某个函数,那么无论如何我都可以像在对象中那样调用OuterDo()
来调用Sub的innerDo
虚拟方法和多态性的面向语言?我真的要避免在Sub中也实现OuterDo()
,因为现实世界的情况要复杂得多,而且嵌套更深。
type Definition interface {
InnerDo()
OuterDo()
}
var x Definition
func main() {
x = &Sub{&Base{}}
x.OuterDo()
}
type Base struct {}
func (b *Base) InnerDo() {
fmt.Println("Base")
}
func (b *Base) OuterDo() {
b.InnerDo()
}
type Sub struct {
*Base
}
func (b *Sub) InnerDo() {
fmt.Println("Sub")
}