在不同版本的实现之上创建层时遇到的一个问题。目的是抽象出实现细节,并且调用者无需关心我们使用的是哪种实现。
请参见代码示例here
^该代码可以更好地解释我遇到的问题。
我们有两个版本的Stream实现Stream1
和Stream2
。它们具有公共接口Stream
。
它们两个都有对应的BindStreamHandler
函数,可以接受StreamHandler1
或StreamHandler2
。
我们有一个函数BindStreamHandler
和一个func StreamHandlerImpl(s Stream)
的常规实现。无论我们使用Stream1
还是Stream2
,总体实现都是相同的。
现在,我面临着一个问题,即将StreamHandlerImpl
下调(接受抽象Stream
到StreamHandler1
(接受Stream1
)。
更新:
我发现this version有用。
func BindHandler(h interface{}) {
if Version == 1 {
h1 := h.(StreamHandler1)
BindStreamHandler1(h1)
} else {
h2 := h.(StreamHandler2)
BindStreamHandler2(h2)
}
}
但是BindHandler
的签名变得太弱了:(我更喜欢使用签名func BindHandler(h StreamHandler)
答案 0 :(得分:1)
似乎您正在尝试使用类层次结构(例如Java)来设计类,而这实际上并不是Go处理OO的方式。我真的建议您围绕接口设计代码,而不要尝试模仿继承。由于我们无法推测为什么会有这种类型,因此下面是一个最小的代码段,它将使BindHandler
保持更严格的签名。
func BindHandler(h StreamHandler) {
if Version == 1 {
BindStreamHandler1(func(s Stream1) {
h(s)
})
} else {
BindStreamHandler2(func(s Stream2) {
h(s)
})
}
}