具体示例在这里:https://play.golang.org/p/ZNmviKWLwe
我有一个接口A。我期望所有实现A的类型都具有某个特定签名(因此使用接口)。我期望其中一个返回实现另一个接口的有用内容。
type Box interface {
GetToy(int) (*Toy, error)
}
type Toy interface{
Play()
}
type CarBox struct {
Length int
Width int
Height int
toys []*Matchbox
}
type Matchbox struct {}
func (b *CarBox) Size () int {
return b.Length*b.Width*b.Height
}
func (b *CarBox) GetToy(j int) (*Matchbox, error) {
return b.toys[j], nil
}
func (m *Matchbox) Play() {
fmt.Println("Zoom!")
}
当然,这种方法是行不通的,因为GetToy()
返回的是*Matchbox
而不是*Toy
,即使Matchbox
是Toy
的一个完美的实现。并且,不,这不是因为指针的问题;无论我在GetToy
中返回*Toy
还是只返回Toy
,结果都是相同的:
tmp/sandbox721971102/main.go:33:15: cannot use CarBox literal (type CarBox) as type Box in return argument:
CarBox does not implement Box (wrong type for GetToy method)
have GetToy(int) (*Matchbox, error)
want GetToy(int) (*Toy, error)
显然我的模式与Go语言的工作方式不匹配。有什么“正确”的方法来解决这个问题吗?