我还在学习Golang,想请教一下。 是否有可能做这样的事情并将任何其他 child 传递给扩展父结构的 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)
}
谢谢
最佳答案
正如其他人所说,忘记继承,Go doesn't have inheritance有充分的理由。所以不要再从 parent 和 child 的角度思考了。 Go 有 composition (您在这里使用的),但它的行为不同。你可以使用 interfaces在 Go 中,以便传入 Child 和 Child2 并让接收者对它得到的是哪一个无所谓(只要它具有相同的功能)。但这可能是一个错误,因为您正在尝试重新创建您在 Go 中熟悉的继承。不要那样做。
如果您的类型像这样相关,您可能应该从接受要修改的类的实例的嵌入式类退后一步。嵌入式类应该作用于它自己的字段,仅此而已 - 这将关注点分开并通过作用于它的方法保存数据。因此,与其考虑 Parents 和 Children,不如考虑一些您想共享的代码/数据。
考虑经典的继承问题动物——有猫和狗。通过继承,您将拥有一只猫和一只狗以及一个抽象基类动物。 Animal 可能具有您期望的所有方法,然后您可能在 Animal 上编写一个什么都不说的 Say() 方法和一个发出呜呜声的 Say() 和一个对狗和猫喵喵叫的 Say() 方法。
在 Go 中,您只需使用 Cats 和 Dogs 以及不同的 Say() 方法,它们都符合其他人定义的 Speaker() 接口(interface)。宁愿有一点重复,也不愿大量额外的代码和复杂性,只是为了分享一点行为。
请务必阅读 Effective Go并尝试使用可用的工具,而不是重新创建您熟悉的继承之类的工具。
关于go - 如何调用父方法并将扩展父结构的任何子结构作为 Golang 中的参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45974464/