Maison  >  Article  >  développement back-end  >  Explication détaillée de la façon dont Golang obtient l'effet d'héritage

Explication détaillée de la façon dont Golang obtient l'effet d'héritage

PHPz
PHPzoriginal
2023-04-11 10:39:25820parcourir

Dans le langage Go, il n'y a pas de notion de classe, il n'y a donc pas d'héritage dans les langages traditionnels orientés objet. Cependant, dans le langage Go, un effet de type héritage peut être obtenu grâce à la combinaison de structures et de champs anonymes.

Tout d’abord, jetons un coup d’œil à l’utilisation de la combinaison dans le langage go. La composition fait référence à l'intégration d'une structure dans une autre structure pour réaliser la réutilisation et la modularisation du code. Par exemple, nous pouvons définir une structure Personne :

type Person struct {
    Name string
    Age int
}

Ensuite, nous pouvons intégrer la structure Personne dans la structure Étudiant :

type Student struct {
    Person
    School string
}

De cette façon, la structure Étudiant a non seulement ses propres attributs, mais peut également transmettre l'attribut Personne pour accéder aux propriétés de la classe parent. Par exemple :

s := Student{
    Person: Person{Name: "Tom", Age: 18},
    School: "CMS",
}
fmt.Println(s.Name) // Tom
fmt.Println(s.Age)  // 18

Vous pouvez également accéder aux méthodes de la classe parent via l'attribut Person intégré :

func (p *Person) SayHello() {
    fmt.Printf("Hello, my name is %s.\n", p.Name)
}

type Student struct {
    Person
    School string
}

func main() {
    s := Student{
        Person: Person{Name: "Tom", Age: 18},
        School: "CMS",
    }
    s.SayHello() // Hello, my name is Tom.
}

Cependant, que se passe-t-il si nous voulons définir une méthode dans la structure Student avec le même nom que la structure Person ? A ce stade, vous devez utiliser les caractéristiques des champs anonymes.

Le champ anonyme est un type de champ spécial qui ne spécifie pas de nom, seulement un type. Grâce à des champs anonymes, les variables et méthodes portant le même nom dans la classe parent peuvent être référencées dans la sous-classe. Nous pouvons utiliser la méthode suivante pour définir une méthode du même nom que la structure Person dans la structure Student :

type Person struct {
    Name string
    Age int
}

func (p *Person) SayHello() {
    fmt.Printf("Hello, my name is %s.\n", p.Name)
}

type Student struct {
    Person
    School string
}

func (s *Student) SayHello() {
    fmt.Printf("Hello, my name is %s and I am a student of %s.\n", s.Name, s.School)
}

func main() {
    s := Student{
        Person: Person{Name: "Tom", Age: 18},
        School: "CMS",
    }
    s.SayHello() // Hello, my name is Tom and I am a student of CMS.
}

Dans le code ci-dessus, nous définissons la méthode SayHello du même nom que la structure Person dans la structure Student, et passez s.Name et s.School pour accéder aux propriétés de la classe parent.

En résumé, le langage Go n'a pas de concept d'héritage, mais grâce à la combinaison de structures et de champs anonymes, des effets similaires à l'héritage peuvent être obtenus.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn