Typaliase und Methodenvererbung
Betrachten Sie den folgenden Codeausschnitt:
package main import ( "fmt" "time" ) type dur struct { time.Duration } type durWithMethods dur type durWithoutMethods time.Duration func main() { var d durWithMethods // works ?? fmt.Println(d.String()) var dWM durWithoutMethods fmt.Println(dWM.String()) // doesn't compile }
Dieser Code zeigt verschiedene Möglichkeiten von Erstellen von Typaliasen und deren Auswirkungen auf die Methode Vererbung.
Typalias vs. Typdefinition
In Go gibt es zwei Arten von Typdeklarationen: Aliase und Definitionen.
Methodenvererbung mit Typaliasen
Der Typalias durWithMethods erstellt einen neuen Typ, der Methoden von seinem zugrunde liegenden Typ erbt. dur, was wiederum time.Duration einbettet. Daher hat durWithMethods Zugriff auf die String()-Methode von time.Duration.
fmt.Println(d.String()) // works
Im Gegensatz dazu benennt der Typalias durWithoutMethods einfach time.Duration um. Da time.Duration ein Rohtyp ist, verfügt er über keine Methoden. Daher verfügt durWithoutMethods nicht über die String()-Methode.
fmt.Println(dWM.String()) // doesn't compile
Typaliase mit demselben zugrunde liegenden Typ
Ein echter Typalias, der einfach einen vorhandenen Typ umbenennt , würde so aussehen:
type sameAsDuration = time.Duration
In diesem Fall hat sameAsDuration die gleichen Methoden wie time.Duration, weil es denselben Typ darstellt.
var sad sameAsDuration fmt.Println(sad.String()) // works
Daher entsteht Verwirrung aufgrund des subtilen Unterschieds zwischen Typaliasen und Typdefinitionen und deren Auswirkungen auf die Methodenvererbung. Typaliase behalten die Methoden ihres zugrunde liegenden Typs bei, während Typdefinitionen neue Typen mit ihrem eigenen Satz von Methoden erstellen.
Das obige ist der detaillierte Inhalt vonErben Typaliase in Go Methoden von ihrem zugrunde liegenden Typ?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!