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

如果 struct A 嵌入在 B 中,A 上的方法可以访问 B 的方法和字段吗?

如果 struct A 嵌入在 B 中,A 上的方法可以访问 B 的方法和字段吗?

Go
慕桂英3389331 2021-08-16 15:45:22
 struct A {}  func (a *A) BName(id int) string {     return a.Name  }  struct B {     *A     Name string  }  func main() {     b := &B{Name: "abc"}     fmt.Println(b.Name)  }代码失败,想知道怎么写代码实现,A.BName可以访问B struct属性Name
查看完整描述

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())


查看完整回答
反对 回复 2021-08-16
?
翻阅古今

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”:匿名字段的访问者..


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

添加回答

举报

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