如何调用父方法并将任何扩展父结构的子进程作为参数传递给Golang

时间:2017-08-31 06:14:42

标签: go composition

我还在学习Golang,我想问一些事情。 有可能做这样的事情并将任何其他孩子传递给扩展父结构的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)
}

谢谢

1 个答案:

答案 0 :(得分:3)

正如其他人所说,忘记继承,Go doesn't have inheritance是有充分理由的。所以不要再考虑父母和孩子了。 Go有composition(你在这里使用),但它的行为有所不同。你可以在Go中使用interfaces来传递Child和Child2,并让接收者对它获得哪一个无关(只要它具有相同的功能)。但这可能是一个错误,因为您正试图重新创建Go中熟悉的继承。不要这样做。

如果您的类型与此类似,那么您应该从接受类的实例的嵌入式类中退一步进行修改。嵌入式类应该根据自己的字段进行操作,这就是它 - 它将关注点分开并将数据与作用于它的方法保持一致。因此,不要考虑父母和孩子,而要考虑一些您想要分享的代码/数据。

考虑经典的继承问题动物 - 与猫和狗。通过继承,您拥有Cat和Dog以及抽象基类Animal。动物可能拥有你期望的所有方法,然后你可能会在Animal上写一个Say()方法,什么也不说,Say()哪个woofs和Say()在Dogs和Cats上喵喵叫。

在Go中你只需拥有Cats and Dogs和一个不同的Say()方法,它们都符合其他人定义的Speaker()接口。为了分享一点点行为,更喜欢复制大量的额外代码和复杂性。

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