为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 go 中嵌入默认实现并参考嵌入类型

如何在 go 中嵌入默认实现并参考嵌入类型

Go
慕的地10843 2021-06-04 09:42:08
我目前正在玩一些 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 已经有一段时间了,这可能很明显……


查看完整回答
反对 回复 2021-06-07
  • 2 回答
  • 0 关注
  • 151 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信