Ich verwende go und habe eine Factory-Funktion, die verschiedene Objekttypen basierend auf der angeforderten Kennung zurückgibt:
func newobject(id string) interface{} { switch id { case "truck": return truck{} case "car": return car{} .... } }
Im Folgenden sind die jeweiligen Strukturtypen aufgeführt:
type Truck struct { Foo string } type Car struct { Bar string }
Wie Sie sehen, haben Lkw und Pkw nichts gemeinsam. Das Problem entsteht, weil ich jetzt anrufe newobject(..)
时必须处理过于宽泛的类型 interface{}
. Ich weiß, dass es Generika gibt, aber dazu ist es erforderlich, eine Liste aller unterstützten Typen in einer Typeinschränkung zu führen, was die Dinge in meiner Codebasis komplizierter macht.
Grundsätzlich suche ich hier nach einer Möglichkeit, die Vererbung zu nutzen, was natürlich von go nicht unterstützt wird. Was ist die Alternative?
newobject(..)
Funktionen können mit der Unterstützung von Generika implementiert werden. Sie müssen keine Liste aller unterstützten Typen in einer Typeinschränkung führen.
func NewObject[T any](id string) T { var vehicle any switch id { case "truck": vehicle = Truck{ Foo: "foo", } case "car": vehicle = Car{ Bar: "bar", } } if val, ok := vehicle.(T); ok { return val } var otherVehicle T fmt.Printf("Not implemented. Returning with default values for \"%v\"\n", id) return otherVehicle }
Das vollständige Beispiel können Sie hier sehen.
Das obige ist der detaillierte Inhalt vonSo beschränken Sie die Schnittstelle{} auf einen bestimmten Typ. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!