interface - 嵌入式结构的覆盖行为

标签 interface go embedding

我有一个 XY 类型,它有各种字段和方法(几十个)。

type XY struct {
    Name      string
    SomeValue int
    ...
}

func (xy *XY) Do1() { ... }
func (xy *XY) Do2() { ... }
func (xy *XY) Do3() { ... }
...

现在我想定义嵌入 XY 的第二种类型,保留所有字段和方法。但我确实想修改一些功能。

type AB struct {
    XY
}

func (ab *AB) Do2() { ... }

到目前为止一切顺利。现在我想将 AB 传递给一个接受 XY 的函数。

func SomeFunc(xy *XY) { ... }

这就是我绊倒的地方,没有多态性。

我可以将 *AB.XY 传递给该函数,但这将不再使用 AB 的 Do2 函数。我可以为它创建一个接口(interface),这可能是预期的方式,但是如果 SomeFunc 需要接近 XY 的所有功能,比如几乎所有领域的 setter/getter ,我基本上需要创建一个 XY 的副本,作为一个接口(interface)(可能的用例:我在服务器上,必须以特定方式向客户端发送值)。我不想只让它成为一个接口(interface),因为我必须重新定义所有使用该接口(interface)的类型中的所有字段和函数。

我能想到解决这个问题的方法,例如使 Do2 成为闭包,根据“主机”类型或 XY 中的枚举字段进行设置,并根据该“类型”变量或使用反射和接口(interface){}更改 Do2 的行为在 SomeFunc 中,但我想知道 Go 中的“正确”方法是什么。即使您有很多功能,您如何以最有效的方式做到这一点?

最佳答案

在 Go 中正确的做法是使用接口(interface)。创建Do1Do2等接口(interface),并使SomeFunc使用该接口(interface)类型。

关于interface - 嵌入式结构的覆盖行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25243726/

相关文章:

c++ - 适合在线嵌入的SVM库

c++ - Variadic模板回调接口(interface)类实例化不能重载

java - Spring bean constructor-arg拒绝我想要传入的对象(实现myInterface),构造函数参数的类型为myInterface

elasticsearch - 在 Golang 中使用 Elasticsearch scriptfield

带有 for 循环的 golang channel 行为

deep-learning - 如何在pytorch中实现低维嵌入层

fonts - FlashDevelop + Haxe-使用嵌入式字体

c# - 实现通用 IEnumerator 和 IComparable 的问题

来自 DLL 的 Delphi 接口(interface)

go - 检查 Go 中已安装的包