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

我有几种相同方法的实现:SetRateForMeasure


package repartition


type 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()

不再定义。


我应该如何组织我的代码?


慕斯709654
浏览 87回答 2
2回答

元芳怎么了

Go 中没有函数重载,因此不能使用不同的参数声明相同的函数。不过,有几种方法可以实现这一点:您可以添加具有不同名称和签名的多个函数您可以更改函数以接受结构而不是参数SetRateForMeasure(args SetRateOptions) float64type SetRateOptions struct { Meter models.Meter Measure models.Measure Total float64 Percentage *float64 // If nil, use default percentage ... // more parameters as needed}

温温酱

Go 不支持方法覆盖。您可以定义具有不同名称且采用不同参数的方法,也可以声明该方法接受参数结构。type SetRateParams struct {    Meter    models.Meter    Measure  models.Measure    Total    float64}type Repartition interface {    SetRateForMeasure(params SetRateParams) float64}(可选)您可以将结构中的参数声明为指针,以便可以使用而不是使用零值来表示“未提供”的语义。对于可能是有效值的数字参数,这可能与此相关。nil0使用结构参数的另一个优点是,如果您决定从现在起6个月后添加额外的参数,则不必更改所有调用站点(您只需将其添加到结构中)。为了说明什么是可能的,varargs也有更糟糕的解决方案,但除非你讨厌类型安全,否则我不建议这样做。interface{}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go