2 回答
TA贡献1757条经验 获得超7个赞
这不可能。struct A 对其嵌入的类型一无所知。想想看,A 可以嵌入到任何其他结构中,那么你怎么能提前知道 A 嵌入到的结构的类型。
如果要这样做,则需要将外部结构 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贡献1780条经验 获得超5个赞
A访问B让我想起了 is-a 关系,其中A"is-a" B。
文章“ Go 是一种面向对象的语言吗? ”确实指出Go 中没有真正的子类型:
如果它真的是子类型,那么匿名字段将导致外部类型成为内部类型。在 Go 中,情况并非如此。这两种类型仍然不同。
匿名字段仍然可以访问,就像它们被嵌入一样
例子:
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()
}
多重继承的问题之一是,当相同的方法存在于多个父类上时,语言通常不明显,有时甚至不明确使用哪些方法。
使用 Go,您始终可以通过与类型同名的属性访问各个方法。
实际上,当您使用匿名字段时,Go 正在创建一个与您的类型同名的访问器。
这就是“ b.A”:匿名字段的访问者..
- 2 回答
- 0 关注
- 171 浏览
添加回答
举报