为了账号安全,请及时绑定邮箱和手机立即绑定

基于接口抽象地实现“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 关注
  • 97 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信