具有不同返回值的接口转换实现相同的接口

时间:2016-06-07 04:04:58

标签: go

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

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

2 个答案:

答案 0 :(得分:1)

将接口更多地视为契约。它们不会隐式地实现其他接口,因为它们没有直接实现任何东西。

实现满足

和接口。 (希望这很有意义)

在您的示例中,使用meachine类型创建的简单“材质”将起作用,如下所示:https://play.golang.org/p/ZoYJog2Xri

package main

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

答案 1 :(得分:0)

这是因为您的铅笔机没有实现Machine2接口。这是罪魁祸首:

func (pm *PencilMachine) Produce() Material1 {
    return &Pencil{}
}

你看,尽管PencilMachine具有相同的函数Produce,但它不会返回相同的数据类型(Material1),因此它只实现了Machine1。 Machine2需要Produce函数才能返回Material2