首页 >后端开发 >Golang >Go 和继承:组合何时在代码可重用性方面胜过继承?

Go 和继承:组合何时在代码可重用性方面胜过继承?

Susan Sarandon
Susan Sarandon原创
2024-11-10 08:35:03304浏览

Go and Inheritance: When Does Composition Outshine Inheritance for Code Reusability?

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
}

虽然此示例有效,由于其循环结构而显得复杂。为了减少代码重复并创建更具可读性的代码,请考虑使用嵌入。

嵌入允许您组合实现特定接口的结构。例如,您可以创建用于读取和写入的窄接口:

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

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

通过组合这些接口,您可以创建一个 ReadWriter 接口:

type ReadWriter interface {
    Reader
    Writer
}

同样,您可以组合以下结构:将 Reader 和 Writer 实现到 MyReadWriter 结构中:

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.
}

type MyReadWriter struct {
    *MyReader
    *MyWriter
}

MyReadWriter 结构现在实现了 ReadWriter 接口,允许您使用在此结构中实现 Reader 或 Writer 的任何组件。

此嵌入技术提高了代码的可重用性、依赖注入,并通过实现特定接口的组件交换来促进测试。

以上是Go 和继承:组合何时在代码可重用性方面胜过继承?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn