gpt4 book ai didi

go - 继承和接口(interface)

转载 作者:IT王子 更新时间:2023-10-29 01:58:10 28 4
gpt4 key购买 nike

我想表达许多语言都拥有的extends行为。

在我的 Go 代码中,我有一些看起来像这样的结构:

type Base struct {
// Some fields
}

type BaseExtender struct {
Base
// Unique fields
}

type AnotherBaseExtender struct {
Base
// Unique fields
}

现在,我想编写一个接受任何 Base 的函数,因为我只需要它的“相似字段”。

func UseTheBase(b Base) {
testVal := b.thingICareAbout
}

但是,这是行不通的。我深入研究了 interface 并认为我可以做类似的事情:

type Base interface {
// Some fields
}

除了 Go 似乎通过方法实现 自动推断接口(interface)。有没有一种方法可以模仿这种行为,这样我就可以将任何 Base 传递到我的函数中,而不必在 Base 结构及其所有扩展器上实现一些 nop 方法?

谢谢!

最佳答案

Base 意味着你想在 Go 中继承,Go 故意回避继承,不要试图重新创建它。您可以嵌入类型,但将其视为嵌入行为,而不仅仅是数据(因为您可能想在继承语言中这样做)。

您的解决方案是正确的,但需要公共(public)方法,是的,接口(interface)是根据方法定义的。只需将调用它的接口(interface)定义为:

type Doer interface {
DoSomething()
}

...
func doit(d Doer) {
d.DoSomething()
}

doit 不关心它的参数是什么,只要它有一个 DoSomething 方法。显然这是一个微不足道的例子,没有任何意义,但是如果你需要在所有扩展器中覆盖一些东西,问问你自己为什么 Base 存在,如果它只是为了添加一些字段,那可能不是一个单独类型的足够理由,只是在需要的地方添加字段。

尽量避免使用其他语言构建的大量类型分类法。

关于go - 继承和接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42802229/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com