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

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

避免在“子類型”之間重復代碼

避免在“子類型”之間重復代碼

Go
喵喔喔 2023-07-31 17:30:06
我正在將一個舊的 Java 項目重寫為 Go。我已經在工作中完成了一些 Go,但我不知道如何將我的 OOP(帶有抽象類等)轉換為 Go 哲學。在這個想法中,我有兩種類型(很快就會有 3 種),它們有一些通用的方法,但其他一些類型(最多只有 1 或 2 個)應該具有相同的簽名,但不具有相同的主體。我知道 Go 沒有某種繼承?,F在我有這樣的事情:type A struct {...}func (a *A) M1 (){ stuff1 }func (a *A) M2 (){ stuff2 }func (a *A) SM (){ special stuff A }然后:type B struct {...}func (b *B) M1 (){ stuff1 }func (b *B) M2 (){ stuff2 }func (b *B) SM (){ special stuff B }我不知道 Go 是如何做到這一點的。在 Java 中,我做了一個抽象類,然后用我的兩個具體類實現了它。我想要的是不必重復 M1() 和 M2(),而是能夠有一個泛型類型來調用這些方法,然后只需為這兩種類型定義 SM() 即可。
查看完整描述

2 回答

?
莫回無

TA貢獻1865條經驗 獲得超7個贊

您可以嵌入一個結構,例如:


type Common struct {}


func (c *Common) M1() {

    fmt.Println("M1")

}


func (c *Common) M2() {

    fmt.Println("M2")

}


type A struct {

    Common

}


func (a *A) SM() {

    fmt.Println("A SM()")

}


type B struct {

    Common

}


func (b *B) SM() {

    fmt.Println("B SM()")

}   


type Thing interface {

    M1()

    M2()

    SM()

}

func main() {

    var a Thing = &A{}

    var b Thing = &B{}


    a.M1()

    b.M2()

    a.SM()

    b.SM()

}

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


查看完整回答
反對 回復 2023-07-31
?
寶慕林4294392

TA貢獻2021條經驗 獲得超8個贊

有幾種不同的方法可以解決這個問題 - 嵌入并不是唯一的答案。如果這些方法想要從偽代碼中定義的類型訪問數據(例如A.M1需要訪問 的字段A),那么嵌入對您沒有幫助,因為嵌入類型不知道它嵌入的類型。您需要從整體上重新考慮您的設計并將其視為 Go 程序,而不是將其設計為 Java 程序并嘗試使這些概念在 Go 中發揮作用。正如許多人發現的那樣,嘗試在 Go 中進行 OOP 設計往往會帶來很大的挫敗感,但成功率卻很低。

另一方面,如果這些方法不需要訪問任何字段,那么它們為什么是方法呢?這些可能只是純函數,這將使它們更易于使用和推理,并且完全消除嵌入或偽造繼承的任何擔憂。


查看完整回答
反對 回復 2023-07-31
  • 2 回答
  • 0 關注
  • 150 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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