1 回答
TA贡献1859条经验 获得超6个赞
当 Go 只提供has-a关系(组合)时,你想要一个is -a关系(继承):
Go 没有继承,因此两种类型之间 不存在is-a关系。
Child
不是一种Parent
,所以指向 a 的指针Parent
不能保留指向 a 的指针Child
;Child
has-aParent
包含在其中。
因为和 之间没有is-a关系,所以不能接收 类型的对象,也不能使用任何实现的方法。此外,这意味着没有人可以直接访问在such上定义的任何方法。Parent
Child
Parent.Foo
Child
Child
Parent
Child
Bar()
B()
通常,Parent
不需要调用Child
. 如果是这样,您将向该Parent
方法传递一个参数,例如Child
满足您通过接口调用该方法的接口或调用该Child
方法的闭包:
// Use of an interface that Child satisfies.
type Beta interface {
B()
}
func (p *Parent) A(b Beta) {
p.Lock()
defer p.Unlock()
b.B()
}
// Use of a closure.
func (p *Parent) Foo(bar func()) {
p.Lock()
defer p.Unlock()
bar()
}
func callFoo(p *Parent, c *Child) {
callBar := func() {
c.Bar()
}
p.Foo(callBar)
}
func (c *Child) Bar() {
// stub
}
func (c *Child) B() {
// stub
}
您可以免费获得Child
can callParent
方法行为,但它只是看起来类似于继承。child.Foo()
actually performs child.Parent.Foo()
,这意味着Parent.Foo
仍然接收一个Parent
实例(因此得名),而不是一个Child
实例。
但是,无法访问任何未明确共享Parent
的信息。接口和闭包可以充当两个类之间的机制,类似于C++ 中的关键字,只是它们比关键字更具限制性。毕竟,不需要共享所有东西,只是它想共享的位,有点类似于C++ 中的这种模式。就我个人而言,我更喜欢接口,因为它允许您的“类”使用多种类型,这些类型都满足一个公共接口,使其与从普通函数或完全不相关的类型的方法调用方法几乎相同。Child
Child
friend
friend
Child
Parent
Parent
- 1 回答
- 0 关注
- 206 浏览
添加回答
举报