【问题标题】:Method overriding in GoGo中的方法覆盖
【发布时间】: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)
}

我有一个结构AA 中有两个函数Func1Func2,函数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 感谢embeddingFunc1 被“升级”为 B。但是,它仍然在 A 类型上运行,因此无法调用 B.Func2
  • Golang Method Override的可能重复
  • 所以解决这个问题的唯一方法是将A.Func1复制到B.Func1并将a.Func2(i)更改为b.Func2(i)?
  • 当然可以,但此时您正在实现完全相同的东西,最好让 A 和 B 都实现相同的接口。
  • 似乎是对的。我会命名http.Client,而不是将其嵌入。这样,如果有人调用 http.Client 未由 B 实现的方法之一,您将不会有任何令人讨厌的意外。

标签: pointers go overriding


【解决方案1】:

您正在使用b 接收者b.A.Func2(i) 类型调用提升的方法a.Func2(i)。所以实际上它是用接收器A 调用函数。由于 go 中没有方法覆盖。只有嵌入类型。因此,如果您希望使用您的功能,则必须创建相同功能的版本。喜欢

func (a *B) Func(i int){
    fmt.Println("Calling function from b receiver")
}

可以在BFunc2中调用这个

func (b *B) Func2(i int) {
    i += 1
    b.Func(i)
}

查看question了解更多详情

【讨论】:

    【解决方案2】:

    使用界面,您可以更接近您想要的功能。

    type F2 interface {
        Func2(i int)
    }
    
    func Func1(f2 F2, i int) {
        f2.Func2(i)
    }
    
    type A struct {
    }
    
    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 a = &A{}
        Func1(a,1)
    
        var b = &B{}
        Func1(b,1)
    }
    

    【讨论】:

    • 这行得通。但是如果A.Func1来自其他包,我仍然需要将A.Func1复制到Func1并重写。
    • 如果A.Func1 来自另一个包,可以说package new。只需在导入包new 后调用带有包名的函数即可。作为new.A.Func1
    • 我的意思是你的 Func1 不在 A 中,但来自其他包的 Func1A 中。如果我想用你的答案,我还是想把A.Func1(...)变成Func1(A, ...)
    猜你喜欢
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    相关资源
    最近更新 更多