问题概述:
目标:创建可重用的基本结构可以由其他结构扩展的方法。然而,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中文网其他相关文章!