In Go gibt es kein direktes Äquivalent zum Methodenüberschreiben, wie es in objektorientierten Sprachen wie Java zu finden ist. Es gibt jedoch alternative Ansätze, um eine ähnliche Funktionalität zu erreichen.
Stellen Sie sich das Szenario vor, in dem Sie einen Basistyp Base mit einer Methode Get() haben, die die Zeichenfolge „base“ zurückgibt. Sie möchten einen neuen Typ Sub definieren, der von Base erbt, aber eine andere Implementierung von Get() hat, die „Sub“ zurückgibt.
Ihr erster Versuch, Komposition wie folgt zu verwenden:
type Sub struct { Base } func(sub *Sub) Get() string { return "Sub" }
funktioniert nicht, da die Get()-Methode von Sub die Get()-Methode von Base nicht überschreiben kann. Dies liegt an der Methodenempfängersemantik von Go, bei der der Empfängertyp (in diesem Fall *Base) die aufzurufende Methode bestimmt.
Ein alternativer Ansatz ist die Verwendung von Schnittstellen. Schnittstellen definieren einen Vertrag von Methoden, die ein Typ implementieren muss, ähnlich wie die abstrakten Klassen von Java. In diesem Fall können Sie einen Schnittstellen-Getter mit einer einzelnen Get()-Methode definieren.
type Getter interface { Get() string }
Sie können dann Base ändern, um die Getter-Schnittstelle zu implementieren:
type Base struct { } func (base *Base) Get() string { return "base" }
Jetzt Sie kann Sub als eine Struktur definieren, die eine Instanz von Base einbettet und auch Getter implementiert:
type Sub struct { Base } func (sub *Sub) Get() string { return "Sub" }
Sie können dann die GetName()-Methode verwenden, um dynamisch zu bestimmen, welche Implementierung von Get() zum Aufrufen:
func (base *Base) GetName(getter Getter) string { if g, ok := getter.(Getter); ok { return g.Get() } else { return base.Get() } }
In der Hauptfunktion können Sie eine Instanz von Sub erstellen, sie in Getter umwandeln und sie dann an GetName() übergeben:
userType := Sub{} fmt.Println(userType.GetName()) // prints "Sub"
Eine weitere Alternative ist die Verwendung der Methodeneinbettung. Dadurch können Sie einer Struktur eine Methode hinzufügen, indem Sie einen Typ einbetten, der diese Methode implementiert. In diesem Fall können Sie einen neuen SubGetter-Typ definieren, der Base einbettet und eine neue Get()-Methode implementiert:
type SubGetter struct { Base } func (sub *SubGetter) Get() string { return "Sub" }
Sie können SubGetter dann als Methode von Base verwenden:
type Base struct { SubGetter }
Dadurch können Sie die Get()-Methode von SubGetter aufrufen, als wäre es eine Methode von Base:
base := Base{} fmt.Println(base.Get()) // prints "Sub"
Das obige ist der detaillierte Inhalt vonWie erreicht man in Go eine methodenüberschreibende Funktionalität?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!