Heim >Backend-Entwicklung >Golang >Go und Vererbung: Wann übertrifft die Komposition die Vererbung für die Wiederverwendbarkeit von Code?

Go und Vererbung: Wann übertrifft die Komposition die Vererbung für die Wiederverwendbarkeit von Code?

Susan Sarandon
Susan SarandonOriginal
2024-11-10 08:35:03305Durchsuche

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

Go und Vererbung: Nutzung von Komposition für die Wiederverwendbarkeit von Code

In Go wird die Erweiterung der Funktionalität über Basisstrukturen hinaus oft mithilfe von Komposition statt Vererbung angegangen. Dies sorgt für Codeklarheit und minimiert Duplikate.

Betrachten Sie das folgende Beispiel, bei dem das Ziel darin besteht, eine Basisstruktur mit Methoden zu definieren, die durch andere Strukturen erweitert werden können:

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
}

Während dieses Beispiel funktioniert Aufgrund seiner zyklischen Struktur erscheint es jedoch verworren. Um die Codeduplizierung zu reduzieren und besser lesbaren Code zu erstellen, sollten Sie die Verwendung von Einbettung in Betracht ziehen.

Einbettung ermöglicht es Ihnen, Strukturen zu erstellen, die bestimmte Schnittstellen implementieren. Sie könnten beispielsweise schmale Schnittstellen zum Lesen und Schreiben erstellen:

type Reader interface {
    Read(p []byte) (n int, err error)
}

type Writer interface {
    Write(p []byte) (n int, err error)
}

Durch die Erstellung dieser Schnittstellen können Sie eine ReadWriter-Schnittstelle erstellen:

type ReadWriter interface {
    Reader
    Writer
}

Auf ähnliche Weise können Sie Strukturen erstellen, die Implementieren Sie Reader und Writer in eine MyReadWriter-Struktur:

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
}

Die MyReadWriter-Struktur jetzt implementiert die ReadWriter-Schnittstelle, sodass Sie jede Komponente, die Reader oder Writer implementiert, innerhalb dieser Struktur verwenden können.

Diese Einbettungstechnik fördert die Wiederverwendbarkeit von Code, die Abhängigkeitsinjektion und erleichtert das Testen, indem sie den Austausch von Komponenten ermöglicht, die bestimmte Schnittstellen implementieren.

Das obige ist der detaillierte Inhalt vonGo und Vererbung: Wann übertrifft die Komposition die Vererbung für die Wiederverwendbarkeit von Code?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn