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

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

如何使這個 Go 抽象類型工作?

如何使這個 Go 抽象類型工作?

Go
繁花不似錦 2021-09-27 20:40:53
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 語言中有意義一樣,您會收到編譯時錯誤。


查看完整回答
反對 回復 2021-09-27
  • 2 回答
  • 0 關注
  • 257 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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