doumisha5081 2014-07-11 11:23
浏览 21
已采纳

改善扩展实施者之间的反思

I have a Result interface which represents the minimum state of a result. Now there are different structs which implement the Result interface but also add own methods. One of them is SpecialResult which implemented the basic Value() method but also a special Special() method.

You can see this in the following snippet:

package main

import (
    "fmt"
    "reflect"
)

type Result interface {
    Value() string
}

type SpecialResult struct {
    value string
}

func (r *SpecialResult) Value() string {
    return r.value
}

func (r *SpecialResult) Special() string {
    return "look I am special!!"
}

func main() {
    sr := &SpecialResult{
        value: "1234",
    }

    doSomething(sr)
}

func doSomething(r Result) {
    switch reflect.TypeOf(r).String() {
    case "*main.SpecialResult":
        fmt.Printf("%s, %s
", r.Value(), r.(*SpecialResult).Special())
        break
    default:
        fmt.Printf("%s
", r.Value())
    }
}
  1. Playground
  2. Source

When you read the last lines of code you might feel the same as I do: This looks very weird.

Is there a better way to achieve the shown setup?

Bodo

  • 写回答

1条回答 默认 最新

  • duanjucong3124 2014-07-11 11:31
    关注

    Use Type Assertions

    package main
    
    import (
        "fmt"
    )
    
    type Result interface {
        Value() string
    }
    
    type SpecialResult struct {
        value string
    }
    
    func (r *SpecialResult) Value() string {
        return r.value
    }
    
    func (r *SpecialResult) Special() string {
        return "look I am special!!"
    }
    
    func main() {
        sr := &SpecialResult{
            value: "1234",
        }
    
        doSomething(sr)
    }
    
    func doSomething(r Result) {
        if special, ok := r.(*SpecialResult); ok {
            fmt.Printf("%s, %s
    ", special.Value(), special.Special())
        } else {
            fmt.Printf("%s
    ", r.Value())
        }
    }
    

    Playground

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 微信会员卡接入微信支付商户号收款
  • ¥15 如何获取烟草零售终端数据
  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?