亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

訪問嵌入式函數中的函數

訪問嵌入式函數中的函數

Go
斯蒂芬大帝 2022-01-10 10:57:18
首先,我對 Go 很陌生,所以請原諒術語中的任何失誤或錯誤。我懷疑我缺乏對術語的掌握也部分歸咎于經過數小時的查找后沒有找到以下問題的答案。簡而言之,我希望以下代碼的輸出為I am the AdultI am the Child相反,輸出在哪里I am the AdultI am the Adult代碼:package mainimport "fmt"type Human struct {    age  uint    name string}func (h Human) sayName() error {    fmt.Println("I am the Adult")    return nil}func (h Human) Introduce() error {    h.sayName()    return nil}type Child struct {    Human}func (c Child) sayName() error {    fmt.Println("I am the Child")    return nil}func main() {    h := Human{}    h.Introduce()    c := Child{Human{}}    c.Introduce()}所以本質上,雖然 Introduce() 只在嵌入類型 Human 中實現,但它調用了 sayName(),它在嵌入類型和嵌入類型中都實現了。我知道當前的輸出是這樣的,因為嵌入的 Human 結構不“知道”它是嵌入的,因此永遠不能調用 Child.sayName 并且只會調用它自己的 sayName() 函數。有沒有辦法實例化一個 Human 結構(或一個嵌入結構),您可以在其中用另一個 sayName() 函數“替換” Human.sayName()?
查看完整描述

3 回答

?
呼如林

TA貢獻1798條經驗 獲得超3個贊

獲得這種后期綁定行為的方法是使用接口。IfIntroduce是接口上的一個sayName方法,它需要一個方法,那么HumanChild 都將滿足該接口,并且可以Introduce自己滿足,并且sayName在任何一種情況下都將調用正確的方法,因為它將通過接口類型而不是 via 分派Human。


查看完整回答
反對 回復 2022-01-10
?
慕的地10843

TA貢獻1785條經驗 獲得超8個贊

你想做的事情是不可能的。正如你所說,Human類型永遠無法知道它的嵌入Child型和為此時Introduce被調用它沒有調用方式Child的類型版本sayName()。您正在嘗試反轉關系,讓嵌入類型在嵌入器中調用其方法的另一個版本。

嵌入類型的方法被提升到嵌入器的范圍,但這是一條單行道,這是明智的。在這種情況下,您只需要以不同的方式構造您的代碼。最有可能的是,您正在尋找的任何行為都可以通過使用接口而不是嵌入來實現。我會提供更多示例,但是對于您的代碼示例,沒什么好說的,顯然要解決這里的問題,您只需調用sayName()并且永遠不會Introduce首先定義,因為它什么都不做。

您可能應該只嵌入相反的方向。Human不包含對的引用,ChildChild確實有對Human和的引用,在這種情況下,兩者都有對 的定義sayName(),Child可以Human通過做來調用's c.Human.sayName()。所以我的直覺說你嵌入了錯誤的方向,或者你應該使用接口。這純粹是一個假設,但我猜你可能有錯誤的想法,因為你指的Human是和“成人”(如父母)和Child作為孩子(就像一個孩子班)。根本不是這種情況。嵌入與組合相同,只是嵌入類型的方法和字段被提升或提升,或者您喜歡說它們被移動到嵌入器范圍的任何術語。話雖如此,我在 SO 上看到了很多關于這個的困惑,這幾乎總是因為提問者把它看作是繼承,而實際上它是組合。


查看完整回答
反對 回復 2022-01-10
?
料青山看我應如是

TA貢獻1772條經驗 獲得超8個贊

我想錯了。正如 hobbs 和 evanmcdonnal 所說,“正確”的做法是讓 Introduce() 函數成為一個帶有接口參數的函數,然后創建一個 Child 和 Human 都實現的接口。


以下給出了所需的輸出:


package main


import "fmt"


type Talker interface {

    sayName() error

}


type Human struct {

    age  uint

    name string

}


func (h Human) sayName() error {

    fmt.Println("I am the Adult")

    return nil

}


type Child struct {

    Human

}


func Introduce(t Talker) error {

    t.sayName()

    return nil

}


func (c Child) sayName() error {

    fmt.Println("I am the Child")

    return nil

}


func main() {

    h := Human{}

    Introduce(h)


    c := Child{Human{}}

    Introduce(c)

}


查看完整回答
反對 回復 2022-01-10
  • 3 回答
  • 0 關注
  • 187 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號