2 回答
TA贡献1865条经验 获得超7个赞
您可以嵌入一个结构,例如:
type Common struct {}
func (c *Common) M1() {
fmt.Println("M1")
}
func (c *Common) M2() {
fmt.Println("M2")
}
type A struct {
Common
}
func (a *A) SM() {
fmt.Println("A SM()")
}
type B struct {
Common
}
func (b *B) SM() {
fmt.Println("B SM()")
}
type Thing interface {
M1()
M2()
SM()
}
func main() {
var a Thing = &A{}
var b Thing = &B{}
a.M1()
b.M2()
a.SM()
b.SM()
}
https://play.golang.org/p/Q3mIH_W8X44
TA贡献2021条经验 获得超8个赞
有几种不同的方法可以解决这个问题 - 嵌入并不是唯一的答案。如果这些方法想要从伪代码中定义的类型访问数据(例如A.M1
需要访问 的字段A
),那么嵌入对您没有帮助,因为嵌入类型不知道它嵌入的类型。您需要从整体上重新考虑您的设计并将其视为 Go 程序,而不是将其设计为 Java 程序并尝试使这些概念在 Go 中发挥作用。正如许多人发现的那样,尝试在 Go 中进行 OOP 设计往往会带来很大的挫败感,但成功率却很低。
另一方面,如果这些方法不需要访问任何字段,那么它们为什么是方法呢?这些可能只是纯函数,这将使它们更易于使用和推理,并且完全消除嵌入或伪造继承的任何担忧。
- 2 回答
- 0 关注
- 106 浏览
添加回答
举报