在Go中,有没有办法使用方法实现接口,其中实现中相应方法的返回类型是“比”预期的返回类型“宽”的?
这很难解释,所以这里有一个例子。在Go Playground中运行以下示例代码时,我收到此错误:
./prog.go:36:14: cannot use BirdImpl{} (type BirdImpl) as type Animal in argument to foo:
BirdImpl does not implement Animal (wrong type for Move method)
have Move() BirdMoveResult
want Move() AnimalMoveResult
(其中 是 “wide than” 因为 任何 实现也是BirdMoveResultAnimalMoveResultBirdMoveResultAnimalMoveResult)
package main
type (
Animal interface {
Move() AnimalMoveResult
}
Bird interface {
Move() BirdMoveResult
}
AnimalMoveResult interface {
GetDistance() int
}
BirdMoveResult interface {
GetDistance() int
GetHeight() int
}
BirdImpl struct{}
BirdMoveResultImpl struct{}
)
// Some implementation of BirdImpl.Move
// Some implementation of BirdMoveResultImpl.GetDistance
// Some implementation of BirdMoveResultImpl.GetHeight
func foo(animal Animal) int {
return animal.Move().GetDistance()
}
func main() {
foo(BirdImpl{}) // This fails because BirdImpl doesn't implement Animal. My question is why not?
}
我知道由于返回类型不同,方法签名不完全匹配,因此Go不考虑作为的实现。但是,如果 Go 比较返回类型,则 的任何实现也会实现 。那么,不应该是一个可接受的实现(如果不是,为什么不呢)?Move()BirdImplAnimalBirdMoveResultAnimalMoveResultMove() BirdMoveResultMove() AnimalMoveResult
编辑:在实际方案中,、 和 是外部包的一部分。在我自己的代码中,我希望能够使用我自己的接口方法进行扩展(如示例中所做的那样),同时仍然能够使用扩展接口来使用。AnimalAnimalMoveResultfooAnimalMoveResultBirdMoveResultfoo
蝴蝶不菲
大话西游666
繁花如伊
相关分类