2 回答

TA貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超7個(gè)贊
這不可能。struct A 對(duì)其嵌入的類(lèi)型一無(wú)所知。想想看,A 可以嵌入到任何其他結(jié)構(gòu)中,那么你怎么能提前知道 A 嵌入到的結(jié)構(gòu)的類(lèi)型。
如果要這樣做,則需要將外部結(jié)構(gòu) B 的引用放入 A 中。
type A struct {
*B
}
func (a *A) PrintName() string { return a.B.Name }
type B struct {
A // no need to use a pointer here
Name string
}
var b B
b.A.B = &b
fmt.Println(b.PrintName())

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超5個(gè)贊
A訪問(wèn)B讓我想起了 is-a 關(guān)系,其中A"is-a" B。
文章“ Go 是一種面向?qū)ο蟮恼Z(yǔ)言嗎? ”確實(shí)指出Go 中沒(méi)有真正的子類(lèi)型:
如果它真的是子類(lèi)型,那么匿名字段將導(dǎo)致外部類(lèi)型成為內(nèi)部類(lèi)型。在 Go 中,情況并非如此。這兩種類(lèi)型仍然不同。
匿名字段仍然可以訪問(wèn),就像它們被嵌入一樣
例子:
package main
type A struct{
// doesn't know anything about B
}
type B struct {
A //B is-a A
}
func (a *A) f() { fmt.Println("A.f") }
func (b *B) f() { fmt.Println("B.f") }
func save(A) {
//do something
}
func main() {
b := B
save(&b) //OOOPS! b IS NOT A
b.f() // B.f()
b.A.f() // A.f()
}
多重繼承的問(wèn)題之一是,當(dāng)相同的方法存在于多個(gè)父類(lèi)上時(shí),語(yǔ)言通常不明顯,有時(shí)甚至不明確使用哪些方法。
使用 Go,您始終可以通過(guò)與類(lèi)型同名的屬性訪問(wèn)各個(gè)方法。
實(shí)際上,當(dāng)您使用匿名字段時(shí),Go 正在創(chuàng)建一個(gè)與您的類(lèi)型同名的訪問(wèn)器。
這就是“ b.A”:匿名字段的訪問(wèn)者..
- 2 回答
- 0 關(guān)注
- 205 瀏覽
添加回答
舉報(bào)