2017-08-31 110 views
-3

我仍然在學習Golang,我想問一些問題。 是否有可能做這樣的事情,並將任何其他孩子傳遞給擴展父結構的PM方法?如何調用父方法並傳遞在Golang中將父結構擴展爲參數的任何子代

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) 
} 

謝謝

+2

這是所有錯誤,可能是一個XY問題。停止考慮現在和永遠的父/子對象層次結構,因爲在這裏__ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _沒有明智的方法來模擬它。 – Volker

+0

感謝您的建議,所以你有什麼建議如何解決這個問題? –

+6

沒有問題描述jet。像「如果我點了啤酒,我怎麼正確吃意大利麪條?」不應答。 – Volker

回答

1

正如其他人所說,忘記繼承,Go doesn't have inheritance有充分的理由。所以,不要在父母和孩子方面思考。去有composition(你在這裏使用),但它的行爲不同。您可以在Go中使用interfaces以傳入Child和Child2,並讓接收者對其獲取哪一個無關緊要(只要它具有相同的功能)。但是這可能是一個錯誤,因爲您試圖重新創建Go中熟悉的繼承。不要這樣做。

如果你的類型是這樣的相關的,你應該退一步從嵌入類接受一個類的實例來修改。嵌入式類應該在自己的領域中行動,就是這樣 - 這會將關注點分隔開來,並將數據與對其採取行動的方法保持一致。因此,不要考慮家長和孩子,而是考慮一些想要分享的代碼/數據。

考慮經典的繼承問題動物 - 與貓和狗。通過繼承,你將擁有一隻貓和一隻狗以及一個抽象基類動物。動物可能有你期望的所有方法,然後你可以在Animal上寫一個Say()方法,該方法什麼也不說,Say()哪個woofs和Say()哪些Meows on Dogs and Cats。

在Go中,您只需在每個上都有Cats and Dogs和一個不同的Say()方法,這兩個方法都符合其他人定義的Speaker()接口。爲了分享一些行爲,需要重複一些額外的代碼和複雜性。

請務必閱讀Effective Go並嘗試使用可用的工具,而不是重新創建您熟悉的繼承等工具。

相關問題