如何调用parent方法并在Golang中将扩展父结构的任何子对象作为参数传递

如何调用parent方法并在Golang中将扩展父结构的任何子对象作为参数传递,go,composition,Go,Composition,我还在学咕噜,我想问点事。 可以这样做并将任何其他子对象传递给扩展父结构的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) }

我还在学咕噜,我想问点事。 可以这样做并将任何其他子对象传递给扩展父结构的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中使用,以便传入Child和Child2,并让接收者不关心它得到的是哪一个(只要它具有相同的功能)。但这可能是一个错误,因为您试图在Go中重新创建您熟悉的继承。不要那样做

如果您的类型是这样相关的,您可能应该从接受要修改的类实例的嵌入式类后退一步。嵌入式类应该作用于它自己的字段,就是这样-这将关注点划分开来,并用作用于它的方法保存数据。因此,与其考虑父母和孩子,不如考虑一些您想要共享的代码/数据

以典型的遗传问题动物为例——猫和狗。有了继承,你会有一只猫、一只狗和一个抽象的基类动物。动物可能拥有你所期望的所有方法,然后你可能会在动物身上写一个Say()方法,它什么也不说,Say()它向狗和猫求爱,说()它喵喵叫

在Go中,你只需要有猫和狗,每个都有不同的Say()方法,它们都符合其他人定义的Speaker()接口。宁愿有一点重复,也不要为了分享一点行为而有很多额外的代码和复杂性


请务必阅读并尝试使用可用的工具,而不是重新创建您熟悉的继承之类的工具

正如其他人所说,忘记继承是有充分理由的。所以,不要再从父母和孩子的角度去思考。Go有(您在这里使用的),但它的行为不同。您可以在Go中使用,以便传入Child和Child2,并让接收者不关心它得到的是哪一个(只要它具有相同的功能)。但这可能是一个错误,因为您试图在Go中重新创建您熟悉的继承。不要那样做

如果您的类型是这样相关的,您可能应该从接受要修改的类实例的嵌入式类后退一步。嵌入式类应该作用于它自己的字段,就是这样-这将关注点划分开来,并用作用于它的方法保存数据。因此,与其考虑父母和孩子,不如考虑一些您想要共享的代码/数据

以典型的遗传问题动物为例——猫和狗。有了继承,你会有一只猫、一只狗和一个抽象的基类动物。动物可能拥有你所期望的所有方法,然后你可能会在动物身上写一个Say()方法,它什么也不说,Say()它向狗和猫求爱,说()它喵喵叫

在Go中,你只需要有猫和狗,每个都有不同的Say()方法,它们都符合其他人定义的Speaker()接口。宁愿有一点重复,也不要为了分享一点行为而有很多额外的代码和复杂性


请务必阅读并尝试使用可用的工具,而不是重新创建您熟悉的继承之类的工具

这完全是错误的,可能是XY问题。现在和永远不要再考虑父/子对象层次结构,因为Go中没有这样的东西,也没有合理的方法来模拟它。谢谢你的建议,那么你对如何解决这个问题有什么建议吗?没有问题。像“如果我点了一杯啤酒,我怎么才能正确地吃意大利面条?”这样的问题是不可回答的。如果你用真实的代码给出你所面临的具体问题,而不是抽象的例子,你会有更好的运气。如果刚开始,请务必阅读有效的go(链接如下)。这完全是错误的,可能是XY问题。现在和永远不要再考虑父/子对象层次结构,因为Go中没有这样的东西,也没有合理的方法来模拟它。谢谢你的建议,那么你对如何解决这个问题有什么建议吗?没有问题。像“如果我点了一杯啤酒,我怎么才能正确地吃意大利面条?”这样的问题是不可回答的。如果你用真实的代码给出你所面临的具体问题,而不是抽象的例子,你会有更好的运气。如果刚开始,一定要阅读有效的围棋(链接如下)。这就是围棋中的代码经常重复的原因。你们只是不承认在现实世界中很多事情都很相似。那么,为什么我必须详细地定义它们,并告诉它们如何详细地工作呢?这就是为什么围棋中的代码经常是重复的。你们只是不承认在现实世界中很多事情都很相似。那么,为什么我必须详细地定义它们,并告诉它们如何详细地工作呢。