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.

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

报告相同问题?

悬赏问题

  • ¥20 @microsoft/fetch-event-source 流式响应问题
  • ¥15 ogg dd trandata 报错
  • ¥15 高缺失率数据如何选择填充方式
  • ¥50 potsgresql15备份问题
  • ¥15 Mac系统vs code使用phpstudy如何配置debug来调试php
  • ¥15 目前主流的音乐软件,像网易云音乐,QQ音乐他们的前端和后台部分是用的什么技术实现的?求解!
  • ¥60 pb数据库修改与连接
  • ¥15 spss统计中二分类变量和有序变量的相关性分析可以用kendall相关分析吗?
  • ¥15 拟通过pc下指令到安卓系统,如果追求响应速度,尽可能无延迟,是不是用安卓模拟器会优于实体的安卓手机?如果是,可以快多少毫秒?
  • ¥20 神经网络Sequential name=sequential, built=False