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