在不同版本的实现之上创建层时遇到的一个问题。目标是抽象出实现细节,调用方不需要关心我们使用的是哪个实现。
请参阅此处的代码示例
^代码可以更好地解释我遇到的问题。
我们有两个版本的流实现Stream1
和Stream2
。它们有一个公共接口Stream
。
它们都具有接受CCD_ 5或CCD_ 6的相应的CCD_。
我们有一个函数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)
似乎您正试图使用类层次结构(如Java(来设计类,而Go实际上并不是这样处理OO的。我真的建议您围绕接口设计代码,而不是试图模仿继承。由于我们无法推测为什么会有这样的类型,下面是一个最小的代码片段,它将使BindHandler
保持更严格的签名。
func BindHandler(h StreamHandler) {
if Version == 1 {
BindStreamHandler1(func(s Stream1) {
h(s)
})
} else {
BindStreamHandler2(func(s Stream2) {
h(s)
})
}
}
游乐场