我还在学习Golang,我想问一些事情。 有可能做这样的事情并将任何其他孩子传递给扩展父结构的PMethod吗?
type Parent struct{
PAttribute string
}
func (p *Parent) PMethod(c *Child){
fmt.Println("this is parent Attribute : " + p.PAttribute)
fmt.Println("this is child Attribute : " + c.CAttribute)
}
type Child struct{
Parent
CAttribute string
}
type Child2 struct{
Parent
CAttribute string
}
func main(){
c := Child{
Parent{
"parent"
},
"child",
}
c.PMethod(&c)
c2 := Child2{
Parent{
"parent"
},
"child",
}
c2.PMethod(&c2)
}
谢谢
答案 0 :(得分:3)
正如其他人所说,忘记继承,Go doesn't have inheritance是有充分理由的。所以不要再考虑父母和孩子了。 Go有composition(你在这里使用),但它的行为有所不同。你可以在Go中使用interfaces来传递Child和Child2,并让接收者对它获得哪一个无关(只要它具有相同的功能)。但这可能是一个错误,因为您正试图重新创建Go中熟悉的继承。不要这样做。
如果您的类型与此类似,那么您应该从接受类的实例的嵌入式类中退一步进行修改。嵌入式类应该根据自己的字段进行操作,这就是它 - 它将关注点分开并将数据与作用于它的方法保持一致。因此,不要考虑父母和孩子,而要考虑一些您想要分享的代码/数据。
考虑经典的继承问题动物 - 与猫和狗。通过继承,您拥有Cat和Dog以及抽象基类Animal。动物可能拥有你期望的所有方法,然后你可能会在Animal上写一个Say()方法,什么也不说,Say()哪个woofs和Say()在Dogs和Cats上喵喵叫。
在Go中你只需拥有Cats and Dogs和一个不同的Say()方法,它们都符合其他人定义的Speaker()接口。为了分享一点点行为,更喜欢复制大量的额外代码和复杂性。
请务必阅读Effective Go并尝试使用可用的工具,而不是重新创建您熟悉的继承等工具。