【发布时间】:2018-02-02 10:42:33
【问题描述】:
根据下面的代码:
type A struct {
}
func (a *A) Func1(i int) {
a.Func2(i)
}
func (a *A) Func2(i int) {
fmt.Println(i)
}
type B struct {
*A
}
func (b *B) Func2(i int) {
i += 1
b.A.Func2(i)
}
func main() {
var b = B{}
b.Func1(1)
}
我有一个结构A,A 中有两个函数Func1、Func2,函数A.Func1 将调用A.Func2。
我还有另一个结构 B 嵌入结构 A,并有一个函数 Func2 覆盖 A.Func2。
当我声明具有值 B{} 的 b 并调用 b.Func1(1) 时,它将运行 A.Func1 并调用 A.Func2 但不会运行 A.Func1 并调用 B.Func2 我覆盖 A.Func2 B.
我的问题是如何修复代码,以便当我调用 b.Func1(1) 时,它将运行 A.Func1 并调用 B.Func2,我在 B 中覆盖 A.Func2。
【问题讨论】:
-
Go 中没有覆盖。
B.Func1感谢embedding。Func1被“升级”为B。但是,它仍然在A类型上运行,因此无法调用B.Func2。 -
所以解决这个问题的唯一方法是将
A.Func1复制到B.Func1并将a.Func2(i)更改为b.Func2(i)? -
当然可以,但此时您正在实现完全相同的东西,最好让 A 和 B 都实现相同的接口。
-
似乎是对的。我会命名
http.Client,而不是将其嵌入。这样,如果有人调用http.Client未由B实现的方法之一,您将不会有任何令人讨厌的意外。
标签: pointers go overriding