Maison > développement back-end > Golang > le corps du texte

Analyse du polymorphisme dans Go - aucune interface requise

藏色散人
Libérer: 2020-12-10 13:50:07
avant
1855 Les gens l'ont consulté

Ce qui suit est une introduction au polymorphisme dans Analyse du polymorphisme dans Go - aucune interface requise from the Colonne tutoriel golang - aucune interface requise, j'espère que cela sera utile aux amis dans le besoin !

Analyse du polymorphisme dans Go - aucune interface requise

Et si vous souhaitez utiliser le polymorphisme dans Analyse du polymorphisme dans Go - aucune interface requise, mais que vous n'aimez pas les interfaces ? Continuez à lire...

Tout d'abord, voyons ce que nous voulons faire :

var dog, duck *Animal

dog = NewDog("fido")
duck = NewDuck("donald")

fmt.Println(dog.makeNoise())
// fido says woof!
fmt.Println(duck.makeNoise())
// donald says quack!
Copier après la connexion

dog et duck ont le même type (*Animal). Chaque variable est instanciée à l'aide d'un constructeur différent, et elles ont un comportement différent lorsque makeNoise la même méthode est appelée.

Habituellement, c'est pour cet exemple que nous utilisons l'interface, mais nous ne voulons pas que l'utilisation réelle soit si simple.

Voyons comment faire fonctionner cela :

Veuillez cliquer ici (https://play.golang.org/p/P5Ovn_K-yyo) pour voir le code complet

type Animal struct {
    makeNoiseFn func(*Animal) string
    name        string
    legs        int
}
Copier après la connexion

La structure Animal contient les attributs name et legs, ainsi qu'un attribut mkeNoiseFn. Cet attribut est en fait une fonction. La fonction accepte un paramètre *Animal et renvoie un. chaîne. La méthode

func (a *Animal) makeNoise() string {
    return a.makeNoiseFn(a)
}
Copier après la connexion

makeNoise n'est en réalité qu'un wrapper qui appelle l'animal correspondant makenoiseFn et prend comme argument un pointeur vers l'animal lui-même.

func NewDog(name string) *Animal {
    return &Animal{
        makeNoiseFn: func(a *Animal) string {
            return a.name + " says woof!"
        },
        legs: 4,
        name: name,
    }
}

func NewDuck(name string) *Animal {
    return &Animal{
        makeNoiseFn: func(a *Animal) string {
            return a.name + " says quack!"
        },
        legs: 4,
        name: name,
    }
}
Copier après la connexion

Maintenant, tout ce que nous avons à faire est de faire en sorte que le même type se comporte différemment et d'attribuer différentes fonctions à ses makeNoiseFn propriétés. Désormais, la méthode makeNoise appelle la fonction correspondante selon que l'animal est un chien ou un canard.

Dois-je faire ça ?

Non !

Cet article est destiné à vous montrer ce que vous pouvez faire, et non ce devriez faire. Si vous devez implémenter le polymorphisme, les interfaces constituent une meilleure approche. Si vous utilisez une interface, ce code ressemblerait à ceci :

type Animal interface {
    makeNoise() string
}

type Dog struct {
    name string
    legs int
}

func (d *Dog) makeNoise() string {
    return d.name + " says woof!"
}

type Duck struct {
    name string
    legs int
}

func (d *Duck) makeNoise() string {
    return d.name + " says quack!"
}

func NewDog(name string) Animal {
    return &Dog{
        legs: 4,
        name: name,
    }
}

func NewDuck(name string) Animal {
    return &Duck{
        legs: 4,
        name: name,
    }
}

func main() {
    var dog, duck Animal

    dog = NewDog("fido")
    duck = NewDuck("donald")

    fmt.Println(dog.makeNoise())
    // fido says woof!
    fmt.Println(duck.makeNoise())
    // donald says quack!
}
Copier après la connexion

Adresse originale : https://www.sohamkamani.com/golang/2019-03-29-polymorphism-without-interfaces/

Adresse de traduction : https://learnku.com/go/t/52404

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!

Étiquettes associées:
source:learnku.com
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal