如何在父方法中调用子方法?

Qth*_*hCN 4 go

package main

import "fmt"

type Super struct{}

func (super *Super) name() string {
    return "Super"
}

func (super *Super) WhoAmI() {
    fmt.Printf("I'm %s.\n", super.name())
}

type Sub struct {
    Super
}

func (sub *Sub) name() string {
    return "Sub"
}

func main() {
    sub := &Sub{Super{}}
    sub.WhoAmI()
}
Run Code Online (Sandbox Code Playgroud)

我想得到"我是Sub",但我得到的是"我是超级的".

我已经知道sub.WhoAmI将调用sub.Super.WhoAmI,但我仍然想知道是否有办法获得"我是Sub".在Python中,当我编写以下代码时:

class Super(object):

    def name(self):
        return "Super"

    def WhoAmI(self):
        print("I'm {name}".format(name=self.name()))

class Sub(Super):

    def name(self):
        return "Sub"


if __name__ == "__main__":
    sub  = Sub()
    sub.WhoAmI()
Run Code Online (Sandbox Code Playgroud)

我可以得到"我是Sub".

Rob*_*ier 7

嵌入不是子类化.Go中没有超类或子类.Sub这里不是"孩子" Super.它包含一个Super.你无法做到.您需要以不同的方式组织代码,以便不需要它.

例如,这里(playground)是一种更自然的方式在Go中执行此操作:

package main

import "fmt"

type Namer interface {
    Name() string
}

type Super struct{}

func (sub *Super) Name() string {
    return "Super"
}

type Sub struct{}

func (sub *Sub) Name() string {
    return "Sub"
}

func WhoAmI(namer Namer) {
    fmt.Printf("I'm %s.\n", namer.Name())
}

func main() {
    sub := &Sub{}
    WhoAmI(sub)
}
Run Code Online (Sandbox Code Playgroud)

这个重点放在接口上,而不是专注于类(Go没有).这不是什么问题的事情,这是他们能有什么问题.这是一种非常强大的编程方法,在实践中通常比继承抽象更灵活,更不容易出错.