我正在嘗試“抽象地”實現一個接口。我的意思是我試圖根據另一個接口的方法來實現該接口的方法。這是我嘗試過的方法(但它不起作用,因為似乎我們不允許使用接口類型作為接收器):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)}
- 1 回答
- 0 關注
- 131 瀏覽
添加回答
舉報
0/150
提交
取消