函数接受抽象接口和函数接受结构实现之间的golang转换



在不同版本的实现之上创建层时遇到的一个问题。目标是抽象出实现细节,调用方不需要关心我们使用的是哪个实现。

请参阅此处的代码示例

^代码可以更好地解释我遇到的问题。

我们有两个版本的流实现Stream1Stream2。它们有一个公共接口Stream

它们都具有接受CCD_ 5或CCD_ 6的相应的CCD_。

我们有一个函数BindStreamHandler,以及func StreamHandlerImpl(s Stream)的一般实现。无论我们使用Stream1还是Stream2,一般实现都是一样的。

现在,我面临着将StreamHandlerImpl(接受抽象StreamStreamHandler1(接受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)
})
}
}

游乐场

最新更新