1 回答

TA貢獻1859條經驗 獲得超6個贊
當 Go 只提供has-a關系(組合)時,你想要一個is?-a關系(繼承):
Go 沒有繼承,因此兩種類型之間 不存在is-a關系。
Child
不是一種Parent
,所以指向 a 的指針Parent
不能保留指向 a 的指針Child
;Child
?has-a?Parent
包含在其中。
因為和 之間沒有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 關注
- 241 瀏覽
添加回答
舉報