亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Golang 繼承和方法覆蓋

Golang 繼承和方法覆蓋

Go
HUWWW 2023-03-29 15:25:06
澄清:我剛剛學習圍棋,遇到了這個問題。我正在嘗試實現一個“類”,它繼承了一個調用應該由子類實現的“虛擬”方法的方法。這是我的代碼:https://play.golang.org/p/ysiaPwARkvlpackage mainimport (    "fmt"    "sync")type Parent struct {  sync.Mutex  MyInterface}func (p *Parent) Foo() {  p.Lock()  defer p.Unlock()  p.Bar()}func (p *Parent) B(){  panic("NOT IMPLEMENTED")}func (p *Parent) A() {  p.Lock()  defer p.Unlock()  p.B()}type MyInterface interface {  Foo()  Bar()}type Child struct {  Parent  Name string}func (c *Child) Bar(){  fmt.Println(c.Name)}func (c *Child) B(){  fmt.Println(c.Name)}func main() {  c := new(Child)  c.Name = "Child"  // c.A() panic  c.Foo() // pointer error}我遺漏了一些關于 sync.Mutex 的代碼,這些代碼對 Child 的值進行一些異步更新。所以顯然在 A() 或 Foo() 中,指針 p 的類型為 Parent。我應該如何更改我的代碼,以便 A/Foo 引用 Child 類中定義的 B/Bar?
查看完整描述

1 回答

?
慕絲7291255

TA貢獻1859條經驗 獲得超6個贊

當 Go 只提供has-a關系(組合)時,你想要一個is?-a關系(繼承):

  • Go 沒有繼承,因此兩種類型之間 不存在is-a關系。Child不是一種Parent,所以指向 a 的指針Parent不能保留指向 a 的指針ChildChild?has-a?Parent包含在其中。

因為和 之間沒有is-a關系,所以不能接收 類型的對象,也不能使用任何實現的方法。此外,這意味著沒有人可以直接訪問在such上定義的任何方法。ParentChildParent.FooChildChildParentChildBar()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

}

您可以免費獲得Childcan callParent方法行為,但它只是看起來類似于繼承。child.Foo()actually performs?child.Parent.Foo(),這意味著Parent.Foo仍然接收一個Parent實例(因此得名),而不是一個Child實例。

但是,無法訪問任何未明確共享Parent的信息。接口和閉包可以充當兩個類之間的機制,類似于C++ 中的關鍵字,只是它們比關鍵字更具限制性。畢竟,不需要共享所有東西,只是它想共享的位,有點類似于C++ 中的這種模式。就我個人而言,我更喜歡接口,因為它允許您的“類”使用多種類型,這些類型都滿足一個公共接口,使其與從普通函數或完全不相關的類型的方法調用方法幾乎相同。ChildChildfriendfriendChildParentParent


查看完整回答
反對 回復 2023-03-29
  • 1 回答
  • 0 關注
  • 241 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號