如何在不同套件中實現具有相同方法簽名的多個介面
假設您需要實現在不同套件中定義且方法簽名衝突的接口。這可能很有挑戰性,但 Go 提供了一個解決方案。
讓我們考慮一個例子:
在包 A 中:
package A type Doer interface { Do() string } func FuncA(doer A.Doer) { // Use doer.Do() here to implement functionality }
B包中:
package B type Doer interface { Do() string } func FuncB(doer B.Doer) { // Use doer.Do() here to implement functionality }
在你的主機套件中:
package main import ( "path/to/A" "path/to/B" ) type C int // C implements both A.Doer and B.Doer, but the implementation of Do() aligns with A. func (c C) Do() string { return "C implements both A and B" } func main() { c := C(0) A.FuncA(c) // Acceptable as C implements A.Doer B.FuncB(c) // Error, as the Do() implementation in C doesn't meet B.Doer requirements }
解決方案:
為了解決這個衝突,Go 提供了一個簡潔的方法:
if _, ok := obj.(A.Doer); ok { }
這允許您在執行時間驗證一個物件(介面類型)是否符合另一個介面類型(例如 A.Doer)。
然而,OP 強調了進一步的複雜性:套件 A 和套件 B 中 Do() 實現的邏輯是不同的。為了解決這個問題,請圍繞您的物件建立包裝器:
透過實作不同的包裝器,您可以根據預期的介面類型(A.Doer 或B.多爾)。這消除了在原始 C 物件上使用單一 Do() 方法的需要,這將很難實現這兩個邏輯。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3