我目前正在玩一些 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())
}
在游戏中:
http://play.golang.org/p/ClOOCef9Zb
我很想听听转到此类问题的其他解决方案(提供使用嵌入类的属性的默认函数)以及此特定问题的解决方案(如果有的话)。到目前为止,我唯一的解决方案是:
需要在满足此接口的所有类型上重新定义方法 hello(),并放弃提供默认方法的“基”类使用指向对象实例的指针调用嵌入的辅助函数,因此类型可以有大部分空方法调用嵌入类型。
如果有完全不同的方法在 Go 中很有价值并且不尝试复制继承模型,我很想知道它们,到目前为止,这是我在继承中唯一错过的时间......
心有法竹
相关分类