Maison > développement back-end > Golang > Comment obtenir une fonctionnalité de remplacement de méthode dans Go ?

Comment obtenir une fonctionnalité de remplacement de méthode dans Go ?

Patricia Arquette
Libérer: 2024-11-22 14:04:32
original
597 Les gens l'ont consulté

How to Achieve Method Overriding Functionality in Go?

Surcharge de méthodes dans Go

Dans Go, il n'y a pas d'équivalent direct au remplacement de méthode comme on le trouve dans les langages orientés objet tels que Java. Cependant, il existe des approches alternatives pour obtenir des fonctionnalités similaires.

Considérez le scénario dans lequel vous disposez d'un type de base Base avec une méthode Get() qui renvoie la chaîne "base". Vous souhaitez définir un nouveau type Sub qui hérite de Base mais a une implémentation différente de Get() qui renvoie "Sub".

Votre tentative initiale d'utiliser la composition comme ceci :

type Sub struct {
    Base
}

func(sub *Sub) Get() string {
    return "Sub"
}
Copier après la connexion

ne fonctionnera pas car la méthode Get() de Sub ne peut pas remplacer la méthode Get() de Base. Cela est dû à la sémantique du récepteur de méthode Go, où le type de récepteur (dans ce cas *Base) détermine la méthode à appeler.

Utilisation des interfaces

Une approche alternative consiste à utiliser des interfaces. Les interfaces définissent un contrat de méthodes qu'un type doit implémenter, similaire aux classes abstraites de Java. Dans ce cas, vous pouvez définir une interface Getter avec une seule méthode Get().

type Getter interface {
    Get() string
}
Copier après la connexion

Vous pouvez ensuite modifier Base pour implémenter l'interface Getter :

type Base struct {
}

func (base *Base) Get() string {
    return "base"
}
Copier après la connexion

Maintenant, vous peut définir Sub comme une structure qui intègre une instance de Base et implémente également Getter :

type Sub struct {
    Base
}

func (sub *Sub) Get() string {
    return "Sub"
}
Copier après la connexion

Vous pouvez ensuite utiliser la méthode GetName() pour déterminer dynamiquement quel implémentation de Get() pour appeler :

func (base *Base) GetName(getter Getter) string {
    if g, ok := getter.(Getter); ok {
        return g.Get()
    } else {
        return base.Get()
    }
}
Copier après la connexion

Dans la fonction principale, vous pouvez créer une instance de Sub, la convertir en Getter, puis la transmettre à GetName() :

userType := Sub{}
fmt.Println(userType.GetName()) // prints "Sub"
Copier après la connexion

Incorporation de méthodes

Une autre alternative consiste à utiliser l'intégration de méthodes. Cela vous permet d'ajouter une méthode à une structure en intégrant un type qui implémente cette méthode. Dans ce cas, vous pouvez définir un nouveau type SubGetter qui embarque Base et implémente une nouvelle méthode Get() :

type SubGetter struct {
    Base
}

func (sub *SubGetter) Get() string {
    return "Sub"
}
Copier après la connexion

Vous pouvez ensuite utiliser SubGetter comme méthode de Base :

type Base struct {
    SubGetter
}
Copier après la connexion

Cela permet d'appeler la méthode Get() de SubGetter comme s'il s'agissait d'une méthode de Base :

base := Base{}
fmt.Println(base.Get()) // prints "Sub"
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal