我试图"抽象地"实现一个接口.我的意思是,我试图用另一个接口的方法实现该接口的方法.
以下是我try 过的(但它不起作用,因为我们似乎不允许使用接口类型作为接收器):
package symbols
import "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 Symbols
func (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中,我们可以轻松避免这种重复;e、 g.通过向抽象类添加具体方法;或者向接口中的某些方法添加"默认"实现.
有没有一种"惯用"的方式在围棋中完成这种事情?(也就是说,我们可以在不复制String()
实现的情况下,创建一个抽象类型,比如Symbol
实现Stringer
吗.