亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何編寫具有不同簽名的同一方法的多個實現

如何編寫具有不同簽名的同一方法的多個實現

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 關注
  • 77 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號