Polymorphismus in Go: Gibt es ihn?
Polymorphismus, die Fähigkeit von Objekten verschiedener Klassen, identische Methoden zu haben, ist ein grundlegender Aspekt der objektorientierten Programmierung. In Go scheinen Setter-Methoden für Schnittstellen jedoch nicht verfügbar zu sein.
Sehen wir uns ein einfaches Beispiel an:
type MyInterfacer interface { Get() int Set(i int) } type MyStruct struct { data int } func (this MyStruct) Get() int { return this.data } func (this MyStruct) Set(i int) { this.data = i }
Wenn dieser Code ausgeführt wird, schlägt die Set-Methode für den MyStruct-Typ fehl, weil Der Empfänger ist kein Zeiger. Alle daran vorgenommenen Änderungen gehen verloren, wenn die Funktion beendet wird.
Man könnte versuchen, dies zu beheben, indem man den Empfänger in einen Zeiger ändert:
func (this *MyStruct) Set(i int) { this.data = i }
Dies würde jedoch zu einem Kompilierungsfehler führen . Schnittstellenmethoden in Go können keine Zeigerempfänger haben.
Gibt es also eine Möglichkeit, in diesem Szenario Polymorphismus zu erreichen?
Die nächstgelegene Alternative ist die Verwendung eines Schnittstellentyps und eine anonyme Struktur, die die Schnittstelle implementiert:
type MyInterfacer interface { Get() int Set(i int) } var mi MyInterfacer = &MyStruct{123} fmt.Println(mi.Get()) // prints 123 mi.Set(456) fmt.Println(mi.Get()) // prints 456
Obwohl diese Lösung kein echter Polymorphismus ist, nutzt sie eine Schnittstelle, um eine saubere und flexible Möglichkeit bereitzustellen um Objekte unterschiedlichen Typs zu manipulieren.
Das obige ist der detaillierte Inhalt vonUnterstützt Go Polymorphismus: Problemumgehungen für Setter-Methoden finden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!