调用embeded struct的接口方法而不丢失接收器上的类型信息

时间:2017-05-02 13:36:13

标签: go

以下代码失败,因为在使用B.Assign(A)之后,B的特定类型的信息丢失了(至少我认为这里出错了):

package main

import "fmt"

type Methods interface {
    Method()
    Assign(Methods)
    Set(Methods)
}

type Parent struct {
    Methods
    assigned Methods
}

type ChildA struct {
    Parent
}

type ChildB struct {
    Parent
    msg string
}

func (this *Parent) Assign(other Methods) {
    //Some other logic here
    other.Set(this)
}

func (this *Parent) Set(other Methods) {
    this.assigned = other
}

func (c *ChildA) Method() {
    fmt.Println("I'm child A")
}

func (c *ChildB) Method() {
    fmt.Println("I'm child B, and I approve this message:", c.msg)
}

func main() {
    A := new(ChildA)
    B := new(ChildB)
    B.msg = "my message"

    B.Assign(A)
    A.assigned.Method()

}

现在,为了避免这种情况,我必须制作另一种方法,它与Parent.Assign()具有完全相同的定义,但接收方不同:

func (this *Parent) Assign(other Methods) {
    //Some other logic here
    other.Set(this)                        
}                                          

func (this *ChildB) Assign(other Methods) {
    //Same as above
    other.Set(this)                        
}                                          

这很难看。有没有办法在从嵌入式结构B调用方法时保留有关Parent类型的信息,而不重复代码?

1 个答案:

答案 0 :(得分:4)

  

有没有办法在从嵌入式struct Parent调用方法时保留有关B类型的信息,而不重复代码?

没有。当您调用嵌入式方法时,将使用指向嵌入式结构的指针调用它。

不幸的是,尽管它看起来很吸引人,但嵌入式对象并没有使Go成为面向对象的语言。

你可能最好只使用一个带有函数指针的类型来实现。