如果结构A嵌入在B中,那么A访问方法和B字段的方法可以吗?

时间:2014-09-04 10:06:19

标签: struct go

  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 个答案:

答案 0 :(得分:6)

这是不可能的。 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())

答案 1 :(得分:1)

A访问B让我想起了一种is-a关系,其中A“是一个”B

文章“Is Go an Object Oriented language?”确实注意到 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”:匿名字段的访问者。