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

如何编写具有不同签名的同一方法的多个实现

如何编写具有不同签名的同一方法的多个实现

Go
慕斯709654 2022-08-24 16:43:46
我有几种相同方法的实现:SetRateForMeasurepackage repartitiontype Repartition interface {    Name() string    Compute(meters []models.Meter, totalsProd, totalsConso map[string]float64) []models.Meter    SetRateForMeasure(meter models.Meter, measure models.Measure, total float64) float64}然后,在我的代码中(在repartition.go中),我称之为:rate := repartition.SetRateForMeasure(meter, measure, total)其中,重新分区是之前定义的接口。问题是,当我添加此方法的新实现时,我的函数的参数可能会有所不同。例如,静态重新分区使用仅在此情况下使用的静态百分比。我最终添加了参数,以便我为所有方法提供了一个通用接口,但是根据实现的不同,它会导致有很多未使用的参数。如果我将其添加到公共接口,它将不用于其他定义。我试图从我的接口定义中删除此方法,但现在rate := repartition.SetRateForMeasure()不再定义。我应该如何组织我的代码?
查看完整描述

2 回答

?
元芳怎么了

TA贡献1798条经验 获得超7个赞

Go 中没有函数重载,因此不能使用不同的参数声明相同的函数。不过,有几种方法可以实现这一点:

  • 您可以添加具有不同名称和签名的多个函数

  • 您可以更改函数以接受结构而不是参数

SetRateForMeasure(args SetRateOptions) float64


type SetRateOptions struct {

 Meter models.Meter

 Measure models.Measure

 Total float64

 Percentage *float64 // If nil, use default percentage

 ... // more parameters as needed

}


查看完整回答
反对 回复 2022-08-24
?
温温酱

TA贡献1752条经验 获得超4个赞

Go 不支持方法覆盖。您可以定义具有不同名称且采用不同参数的方法,也可以声明该方法接受参数结构。


type SetRateParams struct {

    Meter    models.Meter

    Measure  models.Measure

    Total    float64

}


type Repartition interface {

    SetRateForMeasure(params SetRateParams) float64

}

(可选)您可以将结构中的参数声明为指针,以便可以使用而不是使用零值来表示“未提供”的语义。对于可能是有效值的数字参数,这可能与此相关。nil0


使用结构参数的另一个优点是,如果您决定从现在起6个月后添加额外的参数,则不必更改所有调用站点(您只需将其添加到结构中)。


为了说明什么是可能的,varargs也有更糟糕的解决方案,但除非你讨厌类型安全,否则我不建议这样做。interface{}


查看完整回答
反对 回复 2022-08-24
  • 2 回答
  • 0 关注
  • 86 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号