Heim  >  Artikel  >  Backend-Entwicklung  >  Warum erbt ein Typalias Methoden von einem eingebetteten Typ, aber nicht von einem Rohtyp?

Warum erbt ein Typalias Methoden von einem eingebetteten Typ, aber nicht von einem Rohtyp?

Barbara Streisand
Barbara StreisandOriginal
2024-11-16 09:50:03324Durchsuche

Why does a type alias inherit methods from an embedded type but not from a raw type?

Den Einfluss von Typaliasen auf die Methodenvererbung verstehen

Typaliase, ein häufiger Aspekt von Programmiersprachen wie Go, bieten eine praktische Möglichkeit dazu Erstellen Sie neue Bezeichner für vorhandene Typen. Ihr Verhalten in Bezug auf die Methodenvererbung kann jedoch verwirrend sein.

Bedenken Sie den folgenden Go-Code:

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
}

Der Code deklariert drei Typen: dur, durWithMethods und durWithoutMethods. Typ dur ist eine Struktur, die time.Duration einbettet. Der Typ durWithMethods ist als Alias ​​für dur definiert. Der Typ durWithoutMethods hingegen ist ein Alias ​​für time.Duration.

Es stellt sich die Frage, warum durWithMethods die String()-Methode von time.Duration erbt, während durWithoutMethods dies nicht tut.

Typdeklarationen und Methodenvererbung

In Go, Typdeklarationen fallen in zwei Kategorien: Typdefinitionen und Typaliase.

  • Typdefinitionen erstellen neue Typen und verwerfen geerbte Methoden.
  • Typ Aliasebinden lediglich einen neuen Bezeichner an einen vorhandenen Typ.

In diesem Fall dur ist eine Typdefinition, während sowohl durWithMethods als auch durWithoutMethods Typaliase sind.

Auswirkungen auf die Methodenvererbung

Wenn ein neuer Typ mithilfe einer Typdefinition wie dur erstellt wird, wird er verliert alle geerbten Methoden. Das bedeutet, dass dur nicht von Natur aus über die String()-Methode von time.Duration verfügt. Wenn jedoch ein neuer Typ mit einem Typalias wie durWithMethods erstellt wird, erbt er alle Methoden des zugrunde liegenden Typs, in diesem Fall dur.

Time.Duration und Raw Types

time.Duration ist ein Rohtyp, das heißt, er kann keine Methoden haben. Es kann jedoch in eine Struktur wie dur eingebettet werden, wodurch die Struktur ihre Methoden erben kann.

Typalias vs. Direktalias

durWithoutMethods ist ein direkter Alias der Zeit.Dauer. Dieses Typentfernungsverhalten gilt nur für direkte Aliase und gilt nicht für Typaliase wie durWithMethods.

Zusammenfassend lässt sich sagen, dass durWithMethods die String()-Methode von time.Duration erbt, da es sich um einen Alias ​​für einen Typ handelt, der Zeit einbettet .Duration, durWithoutMethods erbt diese Methode nicht, da es sich um einen direkten Alias ​​eines Raw handelt Typ.

Das obige ist der detaillierte Inhalt vonWarum erbt ein Typalias Methoden von einem eingebetteten Typ, aber nicht von einem Rohtyp?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn