如何调用父方法并传递在Golang中将父结构扩展为参数的任何子代
问题描述:
我仍然在学习Golang,我想问一些问题。 是否有可能做这样的事情,并将任何其他孩子传递给扩展父结构的PM方法?如何调用父方法并传递在Golang中将父结构扩展为参数的任何子代
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有充分的理由。所以,不要在父母和孩子方面思考。去有composition(你在这里使用),但它的行为不同。您可以在Go中使用interfaces以传入Child和Child2,并让接收者对其获取哪一个无关紧要(只要它具有相同的功能)。但是这可能是一个错误,因为您试图重新创建Go中熟悉的继承。不要这样做。
如果你的类型是这样的相关的,你应该退一步从嵌入类接受一个类的实例来修改。嵌入式类应该在自己的领域中行动,就是这样 - 这会将关注点分隔开来,并将数据与对其采取行动的方法保持一致。因此,不要考虑家长和孩子,而是考虑一些想要分享的代码/数据。
考虑经典的继承问题动物 - 与猫和狗。通过继承,你将拥有一只猫和一只狗以及一个抽象基类动物。动物可能有你期望的所有方法,然后你可以在Animal上写一个Say()方法,该方法什么也不说,Say()哪个woofs和Say()哪些Meows on Dogs and Cats。
在Go中,您只需在每个上都有Cats and Dogs和一个不同的Say()方法,这两个方法都符合其他人定义的Speaker()接口。为了分享一些行为,需要重复一些额外的代码和复杂性。
请务必阅读Effective Go并尝试使用可用的工具,而不是重新创建您熟悉的继承等工具。
这是所有错误,可能是一个XY问题。停止考虑现在和永远的父/子对象层次结构,因为在这里__ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _没有明智的方法来模拟它。 – Volker
感谢您的建议,所以你有什么建议如何解决这个问题? –
没有问题描述jet。像“如果我点了啤酒,我怎么正确吃意大利面条?”不应答。 – Volker