«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как обрабатывать конфликтующие сигнатуры методов в нескольких интерфейсах?

Как обрабатывать конфликтующие сигнатуры методов в нескольких интерфейсах?

Опубликовано 21 декабря 2024 г.
Просматривать:301

How to Handle Conflicting Method Signatures in Multiple Interfaces?

Как реализовать несколько интерфейсов с одинаковыми сигнатурами методов в разных пакетах

Предположим, вам нужно реализовать интерфейсы, определенные в отдельных пакетах с конфликтующими сигнатурами методов . Это может быть непросто, но 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, различна. Чтобы решить эту проблему, создайте оболочки вокруг вашего объекта:

  • DoerA с C в качестве поля, логически реализуя A.Do().
  • DoerB с C в качестве поля, реализуя B. Do() логически.

Реализуя отдельные оболочки, вы можете контролировать, какой метод использовать в зависимости от ожидаемого типа интерфейса (A.Doer или B.Doer). Это устраняет необходимость в единственном методе Do() для исходного объекта C, который с трудом реализует обе логики.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3