为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
梵蒂冈之花 2021-11-22 18:09:40
package mainimport "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()}我想得到“I'm Sub”,但我得到的是“I'm Super”。我已经知道 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()我可以得到“我是潜艇”。
查看完整描述

2 回答

?
森栏

TA贡献1810条经验 获得超5个赞

把 Go 中的函数想象成它们都属于一个命名空间。Go 确实没有类、方法或继承,因此您尝试的操作永远不会按您的预期工作。


换句话说,当您定义这样的函数时:


func (f *Foo) DoStuff()

你可以想象它真的被定义为:


func DoStuff(f *Foo)

所以你可能会注意到为什么 Go 选择name在你的Super结构上调用函数——它是唯一匹配的函数签名。(请注意,在您的WhoAmI函数super中定义为super *Superso Go 将其与相同类型的相应函数匹配。)


至于如何以 Go 方式执行此操作,请尝试使用接口:


http://play.golang.org/p/8ELw-9e7Re


package main


import "fmt"


type Indentifier interface {

    WhoAmI() string

}


type A struct{}


func (a *A) WhoAmI() string {

    return "A"

}


type B struct{}


func (b *B) WhoAmI() string {

    return "B"

}


func doSomething(x Indentifier) {

    fmt.Println("x is a", x.WhoAmI())

}


func main() {

    doSomething(&A{})

    doSomething(&B{})

}


查看完整回答
反对 回复 2021-11-22
?
MMTTMM

TA贡献1869条经验 获得超4个赞

嵌入不是子类化。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)

}

与其关注类(Go 没有),不如关注接口。这不是事物是什么的问题,而是它们能做什么的问题。这是一种非常强大的编程方法,在实践中通常比继承抽象更灵活且不易出错。


查看完整回答
反对 回复 2021-11-22
  • 2 回答
  • 0 关注
  • 113 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信