我仍在学习Golang,想问点什么。是否可以执行这样的操作并将其他任何子级传递给扩展Parent结构的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的继承是有充分理由的。因此,不要再对父母和孩子进行思考。Go具有成分(您在此处使用的成分),但是其行为有所不同。您可以在Go中使用接口,以传递Child和Child2,并使接收者对接收的对象无动于衷(只要它具有相同的功能)。但是,这可能是一个错误,因为您试图重新创建您在Go中熟悉的继承。不要那样做
如果您的类型是这样相关的,则您可能应该从接受要修改的类实例的嵌入式类中退后一步。嵌入式类应该对自己的字段起作用,仅此而已- 它将关注区分开,并使用作用于其上的方法保存数据。因此,不要考虑父母和孩子,而要考虑要共享的一些代码/数据。
考虑经典的继承问题“动物- 猫和狗”。有了继承,您将拥有一只猫和一条狗以及一个抽象的基类动物。Animal可能具有您期望的所有方法,然后您可能在Animal上写了一个Say()方法,该方法什么也没说,而Say()则向猫叫,而Say()则使猫和狗叫起来。
在Go语言中,您只需拥有Cats and Dogs,并在每个对象上使用不同的Say()方法,它们都符合别人定义的Speaker()接口。为了分享一些行为,宁愿重复一些代码而不是大量额外的代码和复杂性。
请务必阅读“ 有效的Go”并尝试使用可用的工具,而不是重新创建您熟悉的继承之类的工具。