我目前正在玩一些 go 代码,遇到了一个涉及嵌入的小问题,我找不到满意的答案。给定两种类型,其中一种嵌入另一种,并且满足接口,我希望嵌入类型能够反映嵌入器的属性以提供默认响应,以便对象不必定义接口中的所有方法,除非他们想覆盖。在下面的玩具示例中,我希望能够在嵌入式上定义一个 hello() 函数,它处理默认情况并只返回 Name(注意这是一个玩具示例,实际代码更复杂和有用),无需要求对象明确定义接口上的所有方法。真正的代码使用反射来判断对象类型的类名和构造名,目前我正在调用传递类型实例的基类助手,但这感觉并不令人满意。package maintype 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 Objectfunc (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 中很有价值并且不尝试复制继承模型,我很想知道它们,到目前为止,这是我在继承中唯一错过的时间......
2 回答
心有法竹
TA贡献1866条经验 获得超5个赞
为了解决这个问题,我决定放弃 ersatz 继承,并指定模型需要在接口中共享的信息(此处缺少字段的自动属性访问器有点烦人,上面的对象必须显式导出这些以允许任何人通过 MyInterface ref 来使用它们,字段 Name 是公开的,但即使在接口上定义了 Name() 字符串也无法访问)。
然后该模型调用另一个包中的辅助函数,并将自身作为有用的参数提供,并且由于它符合 MyInterface,因此可以通过这种方式进行查询。因此它(以及其他类似的 MyInterface 对象)可以使用它们的公共信息完成复杂的操作并充当外观。显然,在上面的简单示例中,这是毫无意义的,但我想在多个 MyInterface 类型之间共享包中的代码,现在将采用这种方法而不是嵌入。
因此,正如上面 jnml 所指出的,我在这里的主要内容是嵌入对于混合依赖实例状态的函数没有用,并且不是继承层次结构中基类的直接替代。如果您使用 Go 已经有一段时间了,这可能很明显……
- 2 回答
- 0 关注
- 151 浏览
添加回答
举报
0/150
提交
取消