在 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中文网其他相关文章!