Yùjǐn Lín
Yùjǐn Lín

Reputation: 85

Method overriding in Go

According to the code below:

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

I have a struct A, and 2 functions Func1, Func2 in A, function A.Func1 will call A.Func2.

And I have another struct B that embedding struct A, and have a function Func2 that overriding A.Func2.

When I declare b that has value B{} and call b.Func1(1), it will run A.Func1 and call A.Func2 but not run A.Func1 and call B.Func2 that I override A.Func2 in B.

My question is how can I fix the code so that when I call b.Func1(1), it will run A.Func1 and call B.Func2 that I override A.Func2 in B.

Upvotes: 2

Views: 5650

Answers (2)

Grzegorz Żur
Grzegorz Żur

Reputation: 49231

Using interface you can get a little bit closer the functionality you want.

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

Upvotes: 3

Himanshu
Himanshu

Reputation: 12685

You are calling promoted method a.Func2(i) using b receiver b.A.Func2(i) type. So in actual it is calling the function with receiver A. Since there is no method overriding in go. Only there are embedded types . So you have to create your version of the same function if you wants your function to be used. Like

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

can call this in B's Func2

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

Check this question for more details

Upvotes: 3

Related Questions