duanhao9176 2017-05-02 13:36
浏览 26
已采纳

调用嵌入式结构接口方法而不会丢失接收方的类型信息

The following code fails, because after using B.Assign(A), the information on the specific type of B is lost (at least that's what I think goes wrong here):

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

}

Now, in order to avoid this, I would have to make another method, that has exactly the same definition as Parent.Assign(), but different receiver:

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

This is rather ugly. Is there a way to preserve the information about B's type when calling the method from it's embedded struct Parent, without duplicating the code?

  • 写回答

1条回答 默认 最新

  • duanji1924 2017-05-02 14:22
    关注

    Is there a way to preserve the information about B's type when calling the method from it's embedded struct Parent, without duplicating the code?

    No. When you call the embedded method, it is called with a pointer to the embedded struct.

    Unfortunately as attractive as it first seems, embedded objects don't make Go into an object oriented language.

    You might be better off just having one type with function pointers for the implementation.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 相敏解调 matlab
  • ¥15 求lingo代码和思路
  • ¥15 公交车和无人机协同运输
  • ¥15 stm32代码移植没反应
  • ¥15 matlab基于pde算法图像修复,为什么只能对示例图像有效
  • ¥100 连续两帧图像高速减法
  • ¥15 如何绘制动力学系统的相图
  • ¥15 对接wps接口实现获取元数据
  • ¥20 给自己本科IT专业毕业的妹m找个实习工作
  • ¥15 用友U8:向一个无法连接的网络尝试了一个套接字操作,如何解决?