为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕婉清6462132 2021-07-16 18:15:13
为什么具有相同方法的两个命名接口被视为不同的接口 - 如何避免这种情况?假设我们有一个喜欢吃产品的人(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 mainimport "./apple/service"import "./eater"func main() {    appleService := &service.AppleService{}    // func eater.New(productService ProductServiceI)    appleEater := eater.New(appleService)     appleEater.EatUntilHappy()}==> ./eater/eater.go <==package eatertype 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 serviceimport "./apple"type ProductI interface {    Eat()}type AppleService struct {}func (a *AppleService) New() ProductI {    return &apple.Apple{}}==> ./apple/service/apple/apple.go <==package appleimport "fmt"type Apple struct {}func (a *Apple) Eat() {    fmt.Println("mniam, mniam")}我认为只要声明相同,什么名称或什么导入路径都有接口并不重要。
查看完整描述

3 回答

?
慕的地10843

TA贡献1785条经验 获得超8个赞

只是为了完成:如果您在接口中使用私有方法(小写方法名称),可能会发生非常相似的情况(存在具有相同签名的方法,但 Go 找不到它们)。

这样,Go 将其对方法的搜索限制在定义接口的包中,因此不会在实现该方法的包中找到方法。

实际上,我想不出在公共接口中使用私有方法的任何合理理由:对接口的方法使用与接口本身相同的可见性。


查看完整回答
反对 回复 2021-07-19
  • 3 回答
  • 0 关注
  • 200 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信