Go中的方法覆盖

时间:2018-02-02 10:42:34

标签: pointers go method-overriding

根据以下代码:

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)
}

我有一个结构AFunc1中有2个函数Func2A,函数A.Func1会调用A.Func2

我有另一个嵌入struct B的结构A,并且有一个覆盖Func2的函数A.Func2

当我声明值b的{​​{1}}并致电B{}时,它会运行b.Func1(1)并致电A.Func1但不会运行A.Func2并致电A.Func1,我在B.Func2覆盖A.Func2

我的问题是如何修复代码,以便在我致电B时,它会运行b.Func1(1)并致电A.Func1,我会覆盖B.Func2 A.Func2 }}

2 个答案:

答案 0 :(得分:2)

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

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

可以在B' Func2

中调用此功能
func (b *B) Func2(i int) {
    i += 1
    b.Func(i)
}

查看此question了解详情

答案 1 :(得分: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)
}