2 回答

TA貢獻(xiàn)1810條經(jīng)驗 獲得超5個贊
把 Go 中的函數(shù)想象成它們都屬于一個命名空間。Go 確實沒有類、方法或繼承,因此您嘗試的操作永遠(yuǎn)不會按您的預(yù)期工作。
換句話說,當(dāng)您定義這樣的函數(shù)時:
func (f *Foo) DoStuff()
你可以想象它真的被定義為:
func DoStuff(f *Foo)
所以你可能會注意到為什么 Go 選擇name在你的Super結(jié)構(gòu)上調(diào)用函數(shù)——它是唯一匹配的函數(shù)簽名。(請注意,在您的WhoAmI函數(shù)super中定義為super *Superso Go 將其與相同類型的相應(yīng)函數(shù)匹配。)
至于如何以 Go 方式執(zhí)行此操作,請嘗試使用接口:
http://play.golang.org/p/8ELw-9e7Re
package main
import "fmt"
type Indentifier interface {
WhoAmI() string
}
type A struct{}
func (a *A) WhoAmI() string {
return "A"
}
type B struct{}
func (b *B) WhoAmI() string {
return "B"
}
func doSomething(x Indentifier) {
fmt.Println("x is a", x.WhoAmI())
}
func main() {
doSomething(&A{})
doSomething(&B{})
}

TA貢獻(xiàn)1869條經(jīng)驗 獲得超4個贊
嵌入不是子類化。Go 中沒有超類或子類。Sub這里不是 的“孩子” Super。它包含一個Super. 你不能做你想做的事。您需要以不同的方式組織您的代碼,以便不需要它。
例如,這里 ( playground ) 是在 Go 中執(zhí)行此操作的更自然的方法:
package main
import "fmt"
type Namer interface {
Name() string
}
type Super struct{}
func (sub *Super) Name() string {
return "Super"
}
type Sub struct{}
func (sub *Sub) Name() string {
return "Sub"
}
func WhoAmI(namer Namer) {
fmt.Printf("I'm %s.\n", namer.Name())
}
func main() {
sub := &Sub{}
WhoAmI(sub)
}
與其關(guān)注類(Go 沒有),不如關(guān)注接口。這不是事物是什么的問題,而是它們能做什么的問題。這是一種非常強(qiáng)大的編程方法,在實踐中通常比繼承抽象更靈活且不易出錯。
- 2 回答
- 0 關(guān)注
- 139 瀏覽
添加回答
舉報