接口具有相同的方法,但被认为是不同的

为什么具有相同方法的两个命名接口被视为不同的接口 - 如何避免这种情况?


假设我们有一个喜欢吃产品的人(Eater)。他不在乎他是什么产品,他只想被指出从哪里可以买到新产品。换句话说,他想要产品服务,但并不关心产品服务会生产什么产品。在具体的实现中我们会尽量给他喂苹果,所以我们会给他提供appleService。


结果如下:


./main.go:9: cannot use appleService (type *service.AppleService) as type eater.ProductServiceI in function argument:

        *service.AppleService does not implement eater.ProductServiceI (wrong type for New method)

                have New() service.ProductI

                want New() eater.ProductI

接口service.AppleI和eater.AppleI具有相同的方法Eat(),除了 golang 将它们视为不同的方法。为什么以及如何避免这种情况?根据鸭子输入,这应该有效,因为实际ProductServiceI需要的是提供的结构具有Eat()方法 - 它不应该关心什么名称具有接口(service.ProductIvs eater.ProductI)。


下面是完整代码:


==> ./main.go <==


package main


import "./apple/service"

import "./eater"


func main() {

    appleService := &service.AppleService{}

    // func eater.New(productService ProductServiceI)

    appleEater := eater.New(appleService) 

    appleEater.EatUntilHappy()

}

==> ./eater/eater.go <==


package eater


type ProductServiceI interface {

    New() ProductI

}


type ProductI interface {

    Eat()

}


type Eater struct {

    productService ProductServiceI

}


func New(productService ProductServiceI) *Eater {

    return &Eater{

        productService: productService,

    }

}


func (a *Eater) EatUntilHappy() {

    for i:=0; i < 5; i++ {

        product := a.productService.New()

        product.Eat()

    }

}

==> ./apple/service/service.go <==


package service


import "./apple"


type ProductI interface {

    Eat()

}


type AppleService struct {

}


func (a *AppleService) New() ProductI {

    return &apple.Apple{}

}

==> ./apple/service/apple/apple.go <==


package apple


import "fmt"


type Apple struct {

}


func (a *Apple) Eat() {

    fmt.Println("mniam, mniam")

}

我认为只要声明相同,什么名称或什么导入路径都有接口并不重要。


慕婉清6462132
浏览 201回答 3
3回答

慕的地10843

只是为了完成:如果您在接口中使用私有方法(小写方法名称),可能会发生非常相似的情况(存在具有相同签名的方法,但 Go 找不到它们)。这样,Go 将其对方法的搜索限制在定义接口的包中,因此不会在实现该方法的包中找到方法。实际上,我想不出在公共接口中使用私有方法的任何合理理由:对接口的方法使用与接口本身相同的可见性。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go