Heim > Backend-Entwicklung > Golang > Wie kann ich in Go eine vererbungsähnliche Erweiterbarkeit erreichen, ohne die traditionelle Vererbung zu verwenden?

Wie kann ich in Go eine vererbungsähnliche Erweiterbarkeit erreichen, ohne die traditionelle Vererbung zu verwenden?

Patricia Arquette
Freigeben: 2024-11-10 17:04:02
Original
381 Leute haben es durchsucht

How can I achieve inheritance-like extensibility in Go without using traditional inheritance?

Golang und Vererbung: Alternative Ansätze zur Erweiterbarkeit

Problemübersicht:

Ziel: Eine Basisstruktur mit Wiederverwendbarkeit erstellen Methoden, die durch andere Strukturen erweitert werden können. Die Struktur von Go schränkt jedoch den Zugriff auf Methoden der übergeordneten Struktur ein, was die traditionelle Vererbung unmöglich macht.

Ursprüngliches Muster:

Der Benutzer schlägt ein kompliziertes Muster mit vererbungsähnlichem Verhalten vor :

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
}
Nach dem Login kopieren

Go's Approach: Komposition beendet Vererbung

Go fördert die Komposition gegenüber der Vererbung für Flexibilität und Wartbarkeit. Anstelle der Unterklassenbildung fördert Go die Verwendung von Schnittstellen und das Einbetten von Strukturen, um Erweiterbarkeit zu erreichen.

Einbettung:

Einbettung ermöglicht es einer Struktur, die Felder und Methoden einer anderen Struktur direkt einzuschließen und so effektiv wiederzuverwenden seine Funktionalität. Wenn wir beispielsweise eine Reader- und Writer-Schnittstelle haben, können wir eine kombinierte ReadWriter-Schnittstelle erstellen und die Reader- und Writer-Implementierungen einbetten:

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
}
Nach dem Login kopieren

Die MyReadWriter-Struktur kann jetzt auf alle Methoden von beiden MyReader zugreifen und diese verwenden und MyWriter, die die ReadWriter-Schnittstelle nahtlos implementieren.

Abhängigkeit Injektion:

Einbettung erleichtert auch die Abhängigkeitsinjektion, was ein besseres Testen und Entkoppeln ermöglicht. MyReader und MyWriter können in die MyReadWriter-Struktur eingefügt werden, um sicherzustellen, dass die Abhängigkeiten explizit übergeben werden, was die Testbarkeit verbessert.

Beispielverwendung:

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()
}
Nach dem Login kopieren

Hier Beispielsweise kann die rw-Struktur sowohl als Reader als auch als Writer fungieren, was eine vielseitige Verwendung in verschiedenen Szenarien ermöglicht.

Das obige ist der detaillierte Inhalt vonWie kann ich in Go eine vererbungsähnliche Erweiterbarkeit erreichen, ohne die traditionelle Vererbung zu verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage