澄清:我只是在学习GO,并且遇到了这个问题。

我正在尝试实现一个"类",该"类"继承一个方法,该方法调用应由子类实现的"虚拟"方法。 这是我的代码:

https://play.golang.org/p/ysiaPwARkvl

我遗漏了一些有关sync.Mutex的代码,该代码对Child的值进行了异步更新。

因此,显然在A()或Foo()中,指针p的类型为Parent。 我应该如何更改代码,以便A / Foo引用Child类中定义的B / Bar?

当Go仅提供has-a关系(组成)时,您需要一个is-a关系(继承性):

  • Go没有继承,因此两种类型之间没有is-关系。 Child不是Parent的一种,因此指向Parent的指针不能保留指向Child的指针; Child中包含-a Parent

因为ParentChild之间没有is-a关系,所以Parent.Foo无法接收Child类型的对象,也不能使用Child实现的任何方法。同样,这意味着Parent不能直接访问在Child上定义的任何方法,例如Bar()B()

通常,Parent不需要在Child中调用某些方法。如果是这样,您将为Parent方法传递一个参数,例如Child满足您通过该接口调用该方法的接口或一个调用Child方法的闭包:

您获得了Child可以免费调用Parent方法行为的方法,但它看起来仅类似于继承。 child.Foo()实际上执行child.Parent.Foo(),这意味着Parent.Foo仍然接收Parent实例(因此具有名称),而不是Child实例。

但是,Parent无法访问Child未明确共享的有关Child的任何信息。接口和闭包可以充当两个类之间的机制,类似于C ++中的friend关键字,不同之处在于它们比friend关键字更具限制性。毕竟,Child不需要与Parent共享所有内容,只需要共享它想要共享的位,有点类似于C ++中的这种模式。就我个人而言,我更喜欢使用接口,因为它允许您的Parent"类"与满足共同接口的多种类型一起使用,使其与从普通函数或完全不相关的类型的方法中调用该方法几乎相同。