【发布时间】:2017-02-26 11:00:28
【问题描述】:
我正在努力学习围棋。
我在 go:gopkg.in/fatih/set.v0 中找到了一个 Set 的简洁实现,但我更喜欢用一个比 set.Set 更明确的名称来命名我的集合,例如:
type View set.Set
本质上,我希望我的View 类型继承set.Set 的方法。因为,View 是一个 set.Set 的描述符。但我知道 Go 在继承和一般打字方面非常出色。
目前我一直在尝试以下 有点 继承,但在尝试使用 func Union(set1, set2 Interface, sets ...Interface) Interface 或 func (s *Set) Merge(t Interface) 等函数时会导致大量错误:
type View struct {
set.Set
}
我想知道是否有一种方法可以以类似 Go 的方式实现我想要的,或者我只是想将我的优秀 OO 实践应用到一种丢弃它们的语言上,拜托。
【问题讨论】:
-
不要尝试像带有继承的 OO 语言那样编写 Go。没有没有继承,所以你只会制造更多的混乱。如果您想自动委托方法和字段,您可以像在第二个示例中那样使用嵌入,这很好,但请记住,这只是一种组合形式。
-
那么,您的建议是使用原始 set.Set 类型吗?既然使用 set 的函数对嵌入类型来说太麻烦了?还不错,我只是在考虑自己在做什么之前直接潜入了继承。
-
如果你有兴趣,这里有一篇威廉肯尼迪关于这个主题的好文章:goinggo.net/2016/10/reducing-type-hierarchies.html
-
@AdrienLuxey:是的,如果你想要的话,直接使用 set 类型。您必须展示一个嵌入问题的示例,因为它根本不会改变
set.Set的任何行为。 -
@thoeni 感谢您的教程,我正在学习它 :) 感谢 JimB 的精确度,我会照着说的做的!对于新手来说,围棋很费脑筋……我会成功的!