【问题标题】:How to implement interface method with return type is an interface in Golang如何实现带返回类型的接口方法是Golang中的一个接口
【发布时间】:2012-08-08 22:25:41
【问题描述】:

这是我的代码:

type IA interface {
    FB() IB
}

type IB interface {
    Bar() string
}

type A struct {
    b *B
}

func (a *A) FB() *B {
    return a.b
}

type B struct{}

func (b *B) Bar() string {
    return "Bar!"
}

我收到一个错误:

cannot use a (type *A) as type IA in function argument:
    *A does not implement IA (wrong type for FB method)
        have FB() *B
        want FB() IB

这里是完整代码:http://play.golang.org/p/udhsZgW3W2
我应该编辑 IA 接口还是修改我的 A 结构?
如果我在其他包中定义IA、IB(这样我可以共享这些接口),我必须导入我的包并将IB作为A.FB()的返回类型,对吗?

【问题讨论】:

    标签: interface go


    【解决方案1】:

    改变一下

    func (a *A) FB() *B {
        return a.b
    }
    

    进入

    func (a *A) FB() IB {
        return a.b
    }
    

    当然IB 可以在另一个包中定义。因此,如果两个接口都在包foo 中定义并且实现在包bar 中,那么声明是

    type IA interface {
        FB() IB
    }
    

    虽然实施是

    func (a *A) FB() foo.IB {
        return a.b
    }
    

    【讨论】:

    • 这没有回答问题。问题是我们希望将接口放在一个新文件中,而不能更改原始定义。
    • @epsalon 您的问题与原始问题有何关系?请多描述一下。
    • 我认为@epsalon 的问题非常中肯。假设 A 和 B 都定义在一个独立且不可访问的包中。如何追溯定义接口 IA 和 IB?您可能想要这样做的一个示例是,如果您尝试定义这些接口以便在完全不同的包中使用 A 和 B 的模拟,而不能修改声明 A 和 B 的原始文件。
    • 是的,@ishaaq,这正是我的问题。
    • @ishaaq,我在模拟对象时遇到了完全相同的问题。有什么解决办法吗?
    猜你喜欢
    • 2011-05-16
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 2016-01-09
    • 2019-02-10
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    相关资源
    最近更新 更多