如何在不同套件中實現具有相同方法簽名的多個介面
假設您需要實現在不同套件中定義且方法簽名衝突的接口。這可能很有挑戰性,但 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 提供這個衝突,Go 提供這個衝突,Go 提供這個衝突,Go 提供這個衝突,Go 提供了這個衝突,Go了一種簡潔的方法:
if _, ok := obj.(A.Doer); ok { }
這允許您在運行時驗證一個物件(介面類型)是否符合另一個介面類型(例如A.Doer)。
然而,OP 強調了進一步的複雜性:套件 A 和套件 B 中 Do() 實現的邏輯是不同的。要解決此問題,請在物件周圍建立包裝器:
透過實作不同的包裝器,您可以根據預期的介面類型(A.Doer 或 B.Doer)控制要使用的方法。這消除了在原始 C 物件上使用單一 Do() 方法的需要,這將很難實現這兩個邏輯。
以上是如何處理多個介面中方法簽章衝突?的詳細內容。更多資訊請關注PHP中文網其他相關文章!