首頁  >  文章  >  後端開發  >  Go 和繼承:組合何時在程式碼可重用性方面勝過繼承?

Go 和繼承:組合何時在程式碼可重用性方面勝過繼承?

Susan Sarandon
Susan Sarandon原創
2024-11-10 08:35:03282瀏覽

Go and Inheritance: When Does Composition Outshine Inheritance for Code Reusability?

Go 和繼承:採用組合實作程式碼可重複使用性

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn