Предположим, у меня есть следующий код в 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
, как в объектно-ориентированных языках с виртуальными методами а полиморфим? Я действительно хотел бы избежать также реализации OuterDo()
в Sub, поскольку реальный случай намного сложнее и глубже вложен.
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")
}