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

标签 go composition

我还在学习Golang,想请教一下。 是否有可能做这样的事情并将任何其他 child 传递给扩展父结构的 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 doesn't have inheritance有充分的理由。所以不要再从 parent 和 child 的角度思考了。 Go 有 composition (您在这里使用的),但它的行为不同。你可以使用 interfaces在 Go 中,以便传入 Child 和 Child2 并让接收者对它得到的是哪一个无所谓(只要它具有相同的功能)。但这可能是一个错误,因为您正在尝试重新创建您在 Go 中熟悉的继承。不要那样做。

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

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

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

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

关于go - 如何调用父方法并将扩展父结构的任何子结构作为 Golang 中的参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45974464/

相关文章:

bash - 在 Go 中执行带有参数的命令?

unit-testing - 如何在golang中为http请求编写单元测试?

java - 基类的运行时确定

kotlin - 如何将依赖项注入(inject) Kotlin 中的接口(interface)委托(delegate)?

go - 允许从周日到周五运行吗?

go - 当我使用`golang.org/x/time` NewLimiter()时,限制更高的突发,Allow()将返回真正更高的突发

go - 如何使用client-go访问kubernetes CRD?

Java 组合 - 对于原始类型变量也有效吗?

c++ - 在组合的情况下访问 'inner' 类

java - 不同类型的组合