問題概述:
目標:建立可重複使用的基本結構可以由其他結構擴展的方法。然而,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中文網其他相關文章!