преобразование Голанга между функцией, принимающей абстрактный интерфейс, и функцией, принимающей реализацию структуры - PullRequest
0 голосов
/ 01 декабря 2018

Проблема, с которой я столкнулся при создании слоя поверх различных версий реализаций.Цель состоит в том, чтобы абстрагировать детали реализации, и вызывающей стороне не нужно заботиться о том, какую реализацию мы используем.

Пожалуйста, посмотрите пример кода здесь

^код может лучше объяснить проблему, с которой я столкнулся.

У нас есть две версии реализации Stream Stream1 и Stream2.У них общий интерфейс Stream.

Обе они имеют соответствующую BindStreamHandler функцию, принимающую StreamHandler1 или StreamHandler2.

У нас есть функция BindStreamHandler иобщая реализация func StreamHandlerImpl(s Stream).Независимо от того, что мы используем Stream1 или Stream2, общая реализация остается неизменной.

Теперь я сталкиваюсь с проблемой понижения StreamHandlerImpl (принятие тезисов Stream до StreamHandler1 (принятие Stream1).


Обновление:

Я нашел , эта версия сработала.

func BindHandler(h interface{}) {
    if Version == 1 {
        h1 := h.(StreamHandler1)
        BindStreamHandler1(h1)
    } else {
        h2 := h.(StreamHandler2)
        BindStreamHandler2(h2)
    }
}

Но подпись BindHandler становится слишком слабой:(Я предпочитаю использовать подпись func BindHandler(h StreamHandler)

1 Ответ

0 голосов
/ 01 декабря 2018

Кажется, что вы пытаетесь спроектировать свои классы, используя иерархии классов (например, Java), а на самом деле Go не справляется с OO.Я действительно предлагаю вам разрабатывать свой код на основе интерфейсов, а не пытаться имитировать наследование.Поскольку мы не можем рассуждать о том, почему у вас есть такие типы, ниже приведен минимальный фрагмент кода, который заставит BindHandler поддерживать более строгую подпись.

func BindHandler(h StreamHandler) {
    if Version == 1 {
        BindStreamHandler1(func(s Stream1) {
            h(s)
        })
    } else {
        BindStreamHandler2(func(s Stream2) {
            h(s)
        })
    }
}

Playground

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...