Проблема, с которой я столкнулся при создании слоя поверх различных версий реализаций.Цель состоит в том, чтобы абстрагировать детали реализации, и вызывающей стороне не нужно заботиться о том, какую реализацию мы используем.
Пожалуйста, посмотрите пример кода здесь
^код может лучше объяснить проблему, с которой я столкнулся.
У нас есть две версии реализации 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)