为什么具有相同方法的两个命名接口被视为不同的接口 - 如何避免这种情况?
假设我们有一个喜欢吃产品的人(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")
}
我认为只要声明相同,什么名称或什么导入路径都有接口并不重要。
慕的地10843
相关分类