2017-08-31 108 views
-3

我仍然在学习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) 
} 

谢谢

+2

这是所有错误,可能是一个XY问题。停止考虑现在和永远的父/子对象层次结构,因为在这里__ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _没有明智的方法来模拟它。 – Volker

+0

感谢您的建议,所以你有什么建议如何解决这个问题? –

+6

没有问题描述jet。像“如果我点了啤酒,我怎么正确吃意大利面条?”不应答。 – Volker

回答

1

正如其他人所说,忘记继承,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并尝试使用可用的工具,而不是重新创建您熟悉的继承等工具。

相关问题