不同返回值实现同一个接口的接口转换

我正在尝试编写一个涉及模拟几个结构的测试,其中一个结构的函数返回另一个结构的实例。但是,我遇到了可以使用以下代码重现的问题:


package main


type Machine1 interface {

    Produce() Material1

}


type Machine2 interface {

    Produce() Material2

}


type Material1 interface {

    Use() error

}


type Material2 interface {

    Use() error

}


type PencilMachine struct{}


func (pm *PencilMachine) Produce() Material1 {

    return &Pencil{}

}


type Pencil struct{}


func (p *Pencil) Use() error {

    return nil

}


func main() {

    pm := new(PencilMachine)


    var m1 Machine1

    m1 = Machine1(pm)


    var m2 Machine2

    m2 = Machine2(m1)


    _ = m2

}

这给出了以下错误:


prog.go:38: cannot convert m1 (type Machine1) to type Machine2:

    Machine1 does not implement Machine2 (wrong type for Produce method)

        have Produce() Material1

        want Produce() Material2

请注意 Pencil 结构如何实现 Material1 和 Material2 接口。但是 (pm *PencilMachine) Produce() 的返回类型是 Material1 而不是 Material2。很好奇为什么这不起作用,因为任何实现 Material1 的东西也实现了 Material2。


谢谢!


https://play.golang.org/p/3D2jsSLoI0


慕森卡
浏览 178回答 2
2回答

慕桂英4014372

将接口更多地视为合同。它们不会仅仅因为它们不直接实现任何东西而隐式实现其他接口。接口由实现满足。(希望这是有道理的)在您的示例中,两种机器类型都可以创建简单的“材料”,如下所示: https: //play.golang.org/p/ZoYJog2Xripackage maintype Machine1 interface {    Produce() Material}type Machine2 interface {    Produce() Material}type Material interface {    Use() error}type PencilMachine struct{}func (pm *PencilMachine) Produce() Material {    return &Pencil{}}type Pencil struct{}func (p *Pencil) Use() error {    return nil}func main() {    pm := new(PencilMachine)    var m1 Machine1    m1 = Machine1(pm)    var m2 Machine2    m2 = Machine2(m1)    _ = m2}

12345678_0001

这是因为您的铅笔机没有实现 Machine2 接口。这是罪魁祸首:func (pm *PencilMachine) Produce() Material1 {    return &Pencil{}}您会看到,尽管 PencilMachine 具有相同的功能Produce,但它不会返回相同的数据类型(Material1),因此它仅实现 Machine1。Machine2 需要一个Produce函数来返回 Material2
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go