我目前正在玩一些 go 代码,并且遇到了一个涉及嵌入的小问题,我找不到满意的答案。给定两种类型,其中一种嵌入另一种,并且满足接口,我希望嵌入类型能够反映嵌入器的属性以提供默认响应,这样对象就不必定义接口中的所有方法,除非它们想要覆盖。
在下面的玩具示例中,我希望能够在嵌入式上定义一个 hello() 函数,它处理默认情况并只返回 Name (注意这是一个玩具示例,实际代码更复杂和有用),没有要求对象明确定义接口上的所有方法。真正的代码使用反射来判断对象类型的类名和构造名称,目前我正在调用基类助手,传入该类型的实例,但这并不令人满意。
package main
type MyInterface interface {
hello() string
//...
}
type Embedded struct {
}
func (e *Embedded) hello() string {
name := "none"
// Would like to be able to return name of object here *if* embedded
// What's the best approach to tackle this?
return name
}
type Object struct {
*Embedded
Name string
}
/*
// Would like an *optional* override, with default being embedded somehow replying with data from Object
func (o *Object) hello() string {
return o.Name
}
*/
func main() {
o := &Object{Name:"My Object Name"}
println("Hello world",o.hello())
}
在 goplay 上:
http://play.golang.org/p/ClOOCef9Zb
我很想听听 Go 中针对此类问题的其他解决方案(提供使用嵌入类属性的默认函数)以及针对此特定问题的解决方案(如果有的话)。到目前为止,我唯一的解决方案是:
要求在满足此接口的所有类型上重新定义方法 hello(),并放弃拥有提供默认方法的“基”类 使用指向对象实例的指针调用嵌入式帮助函数,因此类型可以大部分为空方法调用嵌入式类型。
如果有完全不同的方法在 Go 中很有价值并且不尝试复制我有兴趣了解它们的继承模型,那么到目前为止,这是我在继承中唯一错过的一次......