1
很簡單的例子,我想:多態性Golang
我從結構A(普通功能)B和使用功能第一步的對象。我需要重新定義B中運行的函數step2。
package main
import "fmt"
type A struct {}
func (a *A) step1() {
a.step2();
}
func (a *A) step2() {
fmt.Println("get A");
}
type B struct {
A
}
func (b *B) step2() {
fmt.Println("get B");
}
func main() {
obj := B{}
obj.step1()
}
我該怎麼辦?
// maybe
func step1(a *A) {
self.step2(a);
}
您必須重新考慮模型,因爲重寫方法根本不適用於Go的OOP構造。就像如果你在A中嵌入A然後調用在A和B上定義的方法C,哪個版本被調用甚至沒有定義;規範中沒有方法解析規則。不要試圖去做。無論你想要完成什麼,都可以通過對象之間略微不同的關係來有效地完成。 – evanmcdonnal
@evanmcdonnal:它不是未定義的,它被定義爲不明確。如果存在衝突的嵌入式標識符,則會出現編譯時錯誤,指出「模糊選擇器」。 – JimB
@Harlam:你不能像繼承一樣構造類型。嵌入類型不能調用外部類型(並且對此不瞭解),因爲嵌入只不過是自動委派。 A中沒有B的'step2',只有'B.A.step1()'的簡寫版本。 – JimB