第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在父方法中調(diào)用子方法?

如何在父方法中調(diào)用子方法?

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”。我已經(jīng)知道 sub.WhoAmI 會調(diào)用 sub.Super.WhoAmI,但我仍然想知道是否有辦法獲得“我是 Sub”。在 Python 中,當(dāng)我編寫以下代碼時: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貢獻(xiàn)1810條經(jīng)驗 獲得超5個贊

把 Go 中的函數(shù)想象成它們都屬于一個命名空間。Go 確實沒有類、方法或繼承,因此您嘗試的操作永遠(yuǎn)不會按您的預(yù)期工作。


換句話說,當(dāng)您定義這樣的函數(shù)時:


func (f *Foo) DoStuff()

你可以想象它真的被定義為:


func DoStuff(f *Foo)

所以你可能會注意到為什么 Go 選擇name在你的Super結(jié)構(gòu)上調(diào)用函數(shù)——它是唯一匹配的函數(shù)簽名。(請注意,在您的WhoAmI函數(shù)super中定義為super *Superso Go 將其與相同類型的相應(yīng)函數(shù)匹配。)


至于如何以 Go 方式執(zhí)行此操作,請嘗試使用接口:


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

}


查看完整回答
反對 回復(fù) 2021-11-22
?
MMTTMM

TA貢獻(xiàn)1869條經(jīng)驗 獲得超4個贊

嵌入不是子類化。Go 中沒有超類或子類。Sub這里不是 的“孩子” Super。它包含一個Super. 你不能做你想做的事。您需要以不同的方式組織您的代碼,以便不需要它。


例如,這里 ( playground ) 是在 Go 中執(zhí)行此操作的更自然的方法:


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)

}

與其關(guān)注類(Go 沒有),不如關(guān)注接口。這不是事物是什么的問題,而是它們能做什么的問題。這是一種非常強(qiáng)大的編程方法,在實踐中通常比繼承抽象更靈活且不易出錯。


查看完整回答
反對 回復(fù) 2021-11-22
  • 2 回答
  • 0 關(guān)注
  • 139 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號