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 }
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 }
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() }
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!