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

Ant*_*wan 1 composition 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)
}
Run Code Online (Sandbox Code Playgroud)

谢谢

Ken*_*ant 5

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

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

考虑一下经典的动物继承问题——猫和狗。通过继承,您将拥有一只猫和一只狗以及一个抽象基类动物。Animal 可能有您期望的所有方法,然后您可能在 Animal 上编写一个 Say() 方法,该方法什么也不说,还有 Say() 方法对狗和猫发出汪汪声,Say() 方法对狗和猫发出喵喵声。

在 Go 中,您只需拥有 Cats 和 Dogs 以及每个方法上的不同 Say() 方法,它们都符合其他人定义的 Speaker() 接口。宁愿做一些重复,也不愿为了共享一点行为而使用大量额外的代码和复杂性。

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

  • 这就是为什么 GO 中的代码经常是重复的。你们只是不承认现实世界中很多事情彼此非常相似。那么为什么我必须详细地定义它们并告诉它们如何详细地工作。 (2认同)