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

TA貢獻2021條經驗 獲得超8個贊
有幾種不同的方法可以解決這個問題 - 嵌入并不是唯一的答案。如果這些方法想要從偽代碼中定義的類型訪問數據(例如A.M1
需要訪問 的字段A
),那么嵌入對您沒有幫助,因為嵌入類型不知道它嵌入的類型。您需要從整體上重新考慮您的設計并將其視為 Go 程序,而不是將其設計為 Java 程序并嘗試使這些概念在 Go 中發揮作用。正如許多人發現的那樣,嘗試在 Go 中進行 OOP 設計往往會帶來很大的挫敗感,但成功率卻很低。
另一方面,如果這些方法不需要訪問任何字段,那么它們為什么是方法呢?這些可能只是純函數,這將使它們更易于使用和推理,并且完全消除嵌入或偽造繼承的任何擔憂。
- 2 回答
- 0 關注
- 150 瀏覽
添加回答
舉報