gpt4 book ai didi

inheritance - Golang 和继承

转载 作者:IT老高 更新时间:2023-10-28 13:01:36 25 4
gpt4 key购买 nike

我想在我的库中提供一个基础结构,其中包含可以“扩展”的方法。

这个基础结构的方法依赖于扩展结构的方法。这在 Go 中是不可能直接实现的,因为结构方法只能访问结构自己的字段,而不是父结构。

关键是要有我不必在每个扩展类中重复的功能。

我想出了这个模式,效果很好,但由于它的循环结构,看起来相当复杂。

我从未在其他 Go 代码中发现过类似的东西。这是不是很不走运?我可以采取哪些不同的方法?

type MyInterface interface {
SomeMethod(string)
OtherMethod(string)
}

type Base struct{
B MyInterface
}

func (b *Base) SomeMethod(x string) {
b.B.OtherMethod(x)
}

type Extender struct {
Base
}

func (b *Extender) OtherMethod(x string) {
// Do something...
}

func NewExtender() *Extender {
e := Extender{}
e.Base.B = &e
return &e
}

最佳答案

正如人们评论中提到的,Go 鼓励组合而不是继承。

要解决您关于减少代码重复的问题,您可以使用 embedding .

使用 Effective Go 中的示例上面链接,你从只做一些事情的非常狭窄的接口(interface)开始:

type Reader interface {
Read(p []byte) (n int, err error)
}

type Writer interface {
Write(p []byte) (n int, err error)
}

然后你可以将接口(interface)组合成另一个接口(interface):

// ReadWriter is the interface that combines the Reader and Writer interfaces.
type ReadWriter interface {
Reader
Writer
}

结构体的工作方式类似,您可以在另一个结构体中组合实现 Reader 和 Writer 的结构体:

type MyReader struct {}
func (r *MyReader) Read(p []byte) (n int, err error) {
// Implements Reader interface.
}
type MyWriter struct {}
func (w *MyWriter) Write(p []byte) (n int, err error) {
// Implements Writer interface.
}

// MyReadWriter stores pointers to a MyReader and a MyWriter.
// It implements ReadWriter.
type MyReadWriter struct {
*MyReader
*MyWriter
}

基本上,任何实现 ReaderWriter 的东西都可以通过将它们组合在一个结构中来重用,并且该外部结构将自动实现 ReadWriter 界面。

这基本上是在做Dependency Injection ,而且它对于测试也非常有用。

以上结构代码示例:

func (rw *MyReadWriter) DoCrazyStuff() {
data := []byte{}
// Do stuff...
rw.Read(data)
rw.Write(data)
// You get the idea...
}

func main() {
rw := &MyReadWriter{&MyReader{}, &MyWriter{}}
rw.DoCrazyStuff()
}

需要指出的是,与其他语言的组合范式略有不同的是,MyReadWriter 结构现在可以同时充当 ReaderWriter。这就是为什么在 DoCrazyStuff() 中我们使用 rw.Read(data) 而不是 rw.Reader.Read(data)

更新:修正了错误的例子。

关于inheritance - Golang 和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32188653/

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