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

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

基于接口抽象地實現“Stringer”

基于接口抽象地實現“Stringer”

Go
慕神8447489 2022-11-28 10:29:12
我正在嘗試“抽象地”實現一個接口。我的意思是我試圖根據另一個接口的方法來實現該接口的方法。這是我嘗試過的方法(但它不起作用,因為似乎我們不允許使用接口類型作為接收器):package symbolsimport "fmt"type Symbol interface {    Name() string}type TerminalSymbol struct {    rune rune}func (t TerminalSymbol) Name() string {    return `'` + string(t.rune) + `'`}type NonTerminalSymbol struct {    name string}func (nt NonTerminalSymbol) Name() string {    return nt.name}//////////////////////////////////////////////////////////// Try to implement 'Stringer' interface for Symbolsfunc (s Symbol) String() string {    //^ ERROR: invalid receiver type Symbol (pointer or interface type)    return fmt.Sprintf("A symbol with name: %v", s.Name())}我想 go 編譯器本質上是在告訴我,根本不支持基于另一個接口實現一個接口?我想我可以簡單地接受提示并改為這樣做:func (s NonTerminalSymbol) String() string {    return fmt.Sprintf("A symbol with name: %v", s.Name())}func (s TerminalSymbol) String() string {    return fmt.Sprintf("A symbol with name: %v", s.Name())}這行得通,但最終會重復“String”方法的實現。在 Java 中,我們可以很容易地避免這種重復;例如,通過向抽象類添加具體方法;或者通過向接口中的某些方法添加“默認”實現。有沒有一種“慣用”的方式來完成這種事情?(也就是說,我們可以在不Symbol復制.StringerString()
查看完整描述

1 回答

?
白衣非少年

TA貢獻1155條經驗 獲得超0個贊

您不能擁有類似于調用具體實現方法的抽象基類的結構。有很多方法可以模擬它,但我猜這不是你要問的。


在 Go 中,接口只是一個方法列表,不存在類繼承的概念。您可以使用類型嵌入構建對象層次結構,但這不提供實現它所需的后期綁定。


但是,您可以這樣做:


為符號創建縱梁函數:


func SymbolToString(s Symbol) string {

       return fmt.Sprintf("A symbol with name: %v", s.Name())

}

String現在您可以為每個結構編寫簡單的方法實現:


type NonTerminalSymbol struct {

    name string

}


func (n NonTerminalSymbol) String() string {return SymbolToString(n)}


查看完整回答
反對 回復 2022-11-28
  • 1 回答
  • 0 關注
  • 131 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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