【发布时间】:2016-01-26 03:32:25
【问题描述】:
为什么我可以说 CreateLion() 的结果,一个指向实现 Cat 接口的结构的指针,是 Cat 接口的一个实例,但我不能说 CreateLion() 是类型“函数返回 Cat 接口。”
实现这种行为的标准 Golang 方法是什么?
package main
import "fmt"
func main() {
var lion Cat := CreateLion()
lion.Meow()
// this line breaks. Why?
var cf CatFactory = CreateLion
}
type Cat interface {
Meow()
}
type Lion struct {}
func (l Lion) Meow() {
fmt.Println("Roar")
}
// define a functor that returns a Cat interface
type CatFactory func() Cat
// define a function that returns a pointer to a Lion struct
func CreateLion() *Lion {
return &Lion{}
}
【问题讨论】:
-
Go 不是 Java。 Go 没有继承,也没有“是”的概念。您对问题建模的尝试看起来像是从 Java 到 Go 的直接翻译。这行不通。从技术上讲,joy miao 的回答是一个完整而明智的解释。 Go 是静态类型的,
*Lion不是Cat,即使*Lion可以分配给Cat类型的变量;但是在匹配类型签名时可分配性不起作用。 Go 中不需要工厂。看看 stdlib 是怎么做的,别再用 Go 写 Java 代码了。 -
使用函数作为类型并不是 Java 独有的,@Volker。此代码不是从 Java 翻译过来的。
-
稍作改动就可以正常工作:play.golang.org/p/ECSpoOIuzEx 继承并不是真正的问题。 Go 的 OO 构造主题较小,就像 Java 相对于 C++ 具有较小的子集一样
标签: go