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鼓励构成而不是继承.
要解决有关减少代码重复的问题,您可能需要使用embedding. 使用上面链接的Effective Go中的示例,您可以从非常窄的接口开始,只做几件事: type Reader interface { Read(p []byte) (n int,err error) } type Writer interface { Write(p []byte) (n int,err error) } 然后,您可以将接口组合到另一个接口: // 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 } 基本上,任何实现Reader或Writer的东西都可以通过在struct中组合在一起来重用,而外部struct会自动实现ReaderWriter接口. 这基本上是做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结构现在可以充当Reader和Writer.这就是为什么在DoCrazyStuff()中我们执行rw.Read(data)而不是rw.Reader.Read(data). 更新:修正了不正确的例子. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |