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
Patricia Arquetteoriginal
2024-11-22 14:04:32529parcourir

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"
}

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
}

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

type Base struct {
}

func (base *Base) Get() string {
    return "base"
}

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"
}

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()
    }
}

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"

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"
}

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

type Base struct {
    SubGetter
}

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"

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