将数据和函数与接口和结构相结合的组合

时间:2017-04-13 07:14:09

标签: go composition

我想知道这是否是在Go中完成的,或者我认为这一切都是错的:编写type x interfacetype x struct所以我的接口方法也可以访问特定数据:< / p>

我的C程序员希望这样做:

type PluginHandler interface {
    onLoad()
    pm *PluginManager
}
func (ph PluginHandler) onLoad() {
    pm.DoSomething()
}

我有一个用函数定义的接口,但是我想传递给那些函数的一些数据,但这是一个语法错误。

这是通过其他方法实现的,或者我只是在考虑问题是错误的吗?

3 个答案:

答案 0 :(得分:2)

您错误地定义了onLoad。您无法直接在接口类型上定义函数。

一旦有了接口,就需要另一种类型来实现接口中指定的方法。例如,如果另一个类型实现onLoad方法,它们会自动(隐式)实现接口PluginHandler

您需要做的另一件事是更改接口函数类型以接受所需的数据:

type PluginHandler interface {
    onLoad(*PluginManager)
}

struct SomeType {
    // ...
}

func (s SomeType) onLoad(pm *PluginManager) { // SomeType now implements
    pm.DoSomething()                          // PluginHandler interface.
}

通过这种方式,您可以注入PluginManager所需的PluginHandler

此外,您可以SomeType使用PluginHandler类型。

func someFuntion(ph PluginHandler) {
    // ...
    ph.onLoad(pm)
    // ...
}

可以使用类型为SomeType的输入参数调用:

s := SomeType{}
someFunction(s)

答案 1 :(得分:1)

TL; DR; 没有直接翻译为Go。

答案很长:

Go接口只是 方法。

Go结构只是 数据(可能有接收方法)。

您可以在结构中引用,甚至嵌入接口:

type Frobnicator interface {
    Frobnicate() error
}

type Widget struct {
    Frobnicator
    WidgetName string
}

但那不是你所说的。

你的困境的最佳答案是,我相信:退后一步。你专注于树木,你需要看看森林。 Go采用与C不同的方法,或者像C ++和Java这样的经典OO语言。

看看要解决的一般问题,并在Go中找到解决方案。这可能是一个痛苦的过程(我可以从经验中说),但它确实是学习新思维方式的唯一方法。

答案 2 :(得分:0)

仅为记录,您可以通过引入另一个(间接)类型为现有类型添加额外的方法:

type HandlerManager PluginManager

func (x *HandlerManager) onLoad() {
    ((*PluginManager)(x)).DoSomething()
}

如果您需要使用更通用的解决方案,可以使用Adapter&amp; amp;战略模式可以做到:

type PluginHandlerAdapter struct{ _onLoad func() }

func (x *PluginHandlerAdapter) onLoad() {
    x._onLoad()
}

像(忽略公共/私人访问)一样使用:

type PluginManager struct {
    PluginHandlerAdapter
}

func NewPluginManager() *PluginManager {
    res := new(PluginManager)
    res._onLoad = res.DoSomething
    return res
}