一尘不染

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

go

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

谢谢


阅读 370

收藏
2020-07-02

共1个答案

一尘不染

就像其他人所说的,忘记继承,Go的继承是有充分理由的。因此,不要再对父母和孩子进行思考。Go具有成分(您在此处使用的成分),但是其行为有所不同。您可以在Go中使用接口,以传递Child和Child2,并使接收者对接收的对象无动于衷(只要它具有相同的功能)。但是,这可能是一个错误,因为您试图重新创建您在Go中熟悉的继承。不要那样做

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

考虑经典的继承问题“动物-
猫和狗”。有了继承,您将拥有一只猫和一条狗以及一个抽象的基类动物。Animal可能具有您期望的所有方法,然后您可能在Animal上写了一个Say()方法,该方法什么也没说,而Say()则向猫叫,而Say()则使猫和狗叫起来。

在Go语言中,您只需拥有Cats and
Dogs,并在每个对象上使用不同的Say()方法,它们都符合别人定义的Speaker()接口。为了分享一些行为,宁愿重复一些代码而不是大量额外的代码和复杂性。

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

2020-07-02