首页 > 后端开发 > Golang > 正文

如何在不使用传统继承的情况下在 Go 中实现类似继承的可扩展性?

Patricia Arquette
发布: 2024-11-10 17:04:02
原创
359 人浏览过

How can I achieve inheritance-like extensibility in Go without using traditional inheritance?

Golang 和继承:可扩展性的替代方法

问题概述:

目标:创建可重用的基本结构可以由其他结构扩展的方法。然而,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 的方法:组合结束继承

Go 鼓励组合而不是继承,以实现灵活性和可维护性。 Go 提倡使用接口和嵌入结构体来实现可扩展性,而不是子类化。

嵌入:

嵌入允许一个结构体直接包含另一个结构体的字段和方法,从而有效地重用它的功能。例如,如果我们有 Reader 和 Writer 接口,我们可以创建一个组合的 ReadWriter 接口并嵌入 Reader 和 Writer 实现:

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

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

type ReadWriter interface {
    Reader
    Writer
}

type MyReadWriter struct {
    *MyReader
    *MyWriter

    // Additional ReadWriter-specific methods if needed
}
登录后复制

MyReadWriter 结构现在可以访问和使用 MyReader 中的所有方法和 MyWriter,无缝实现 ReadWriter 接口。

依赖注入:

嵌入还有助于依赖注入,从而可以更好地进行测试和解耦。可以将 MyReader 和 MyWriter 注入到 MyReadWriter 结构体中,确保显式传入依赖项,提高可测试性。

用法示例:

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()
}
登录后复制

在此例如,rw 结构体既可以充当 Reader,也可以充当 Writer,从而可以在各种场景中实现多种用途。

以上是如何在不使用传统继承的情况下在 Go 中实现类似继承的可扩展性?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板