package mainimport "fmt"type IA interface { A() B()}type AbsA struct { IA}type CA struct { AbsA}func (a CA) B() { fmt.Println("Show B")}func (a AbsA) A() { fmt.Println("Show A") a.B()}func t7() { var a IA a = CA{} a.A()}func main() { t7()}運行這個會得到一個 nil 指針 panic,因為當AbsA調用 時B(),它會使用內嵌的IA,但是IA是一個接口。有什么辦法可以使這項工作?編輯我嘗試做一個抽象的超類,AbsA只實現了接口的一部分,但是需要用到其他的函數,A是AbsA的子類,只實現了接口的其余部分。但這看起來很糟糕,有沒有其他方法可以做到這一點?實際上,我只是想做這樣的事情func (a IA)A(){ fmt.Println("Show A") a.B()}但是 go 不能使用接口作為接收器。
2 回答

POPMUISE
TA貢獻1765條經驗 獲得超5個贊
不,至少不像你在這里設計的那樣。我不完全確定您要完成什么,但這是對嵌入的非常差的使用。它不起作用的原因是因為該CA
類型依賴于AbsA
方法的嵌入類型,該方法A()
然后調用“方法 b”,但唯一的實際實現將B()
CA 作為接收類型,因此一旦您調用了嵌入類型的實現A()
它無法回調到 的嵌入類型實現B()
。
您將嵌入視為兩條路,但實際上嵌入類型知道其嵌入的所有方法,而嵌入對嵌入器一無所知。在我個人看來,這應該會產生編譯器錯誤。也許在未來的版本中它會(如果我能在編譯時告訴您編譯器也應該能夠 100% 地遇到運行時錯誤,對嗎?)。
因為它是現在你要么需要實現B()
與類型的接收器Absa
或添加的另一種實現方式A()
與類型的接收器CA
。我不確定你想要完成什么,所以我不能說最好的行動方案是什么。請注意,如果我將此與傳統的 OOP 繼承相關聯,我會將您的代碼描述為嘗試從父類中訪問子類的屬性,顯然這是不可能的。Absa
將永遠無法調用B()
為嵌入它的類型定義的實現。就像嘗試使用在從父級繼承的類型上定義的方法永遠不會工作或僅在大多數 OOP 語言中有意義一樣,您會收到編譯時錯誤。
- 2 回答
- 0 關注
- 257 瀏覽
添加回答
舉報
0/150
提交
取消