Как реализовать несколько интерфейсов с одинаковыми сигнатурами методов в разных пакетах
Предположим, вам нужно реализовать интерфейсы, определенные в отдельных пакетах с конфликтующими сигнатурами методов . Это может быть непросто, но 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) во время выполнения.
Однако ФП подчеркивает еще одну сложность : логика, реализованная для Do() в пакете A и пакете B, различна. Чтобы решить эту проблему, создайте оболочки вокруг вашего объекта:
Реализуя отдельные оболочки, вы можете контролировать, какой метод использовать в зависимости от ожидаемого типа интерфейса (A.Doer или B.Doer). Это устраняет необходимость в единственном методе Do() для исходного объекта C, который с трудом реализует обе логики.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3