IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Go Discussion :

Polymorphisme en Go


Sujet :

Go

  1. #1
    Membre extrêmement actif
    Avatar de Madmac
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    1 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 685
    Points : 1 376
    Points
    1 376
    Billets dans le blog
    7
    Par défaut Polymorphisme en Go
    Lorsque j'apprends un nouveau langage, j'ai l'habitude de "traduire la version en Pascal de l'interpréteur LISP" de Kamin. Ce programme utilise 90% des particularités d'un langage.

    Mon problème est comment réussir du Polymorphisme en Go. C'est un truc d'importance majeur, car cela permet de se débarrasser de beaucoup de branchement logique.

    la portion de code qui me cause des ennuis est la suivante*:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
       EXPTYPE = (VALEXP,VAREXP,APEXP);
       EXPREC = record
                   case etype: EXPTYPE of
                      VALEXP: (num: NUMBER);
                      VAREXP: (varble: NAME);
                      APEXP: (optr: NAME; args: EXPLIST)
                end;
    EXPTYPE sont 3 types de structure qui représente 3 d'atomes dans le langage LISP

    NUMBER: structure avec un nom de type et un nombre.
    VAREXP: structure avec un nom de type et un nom de variable.
    APEXP: structure avec un de type, une référence à une variable et une structure pour la valeur de la variable

    Et les EXPTYPEs servent à fabriquer des listes.

  2. #2
    Membre éclairé
    Homme Profil pro
    Urbaniste
    Inscrit en
    Août 2023
    Messages
    386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Août 2023
    Messages : 386
    Points : 788
    Points
    788
    Par défaut
    Bonjour,

    Avez vous manqué la documentation qui explique le fonctionnement des interfaces ?
    https://go.dev/doc/effective_go#interfaces_and_types

    Sans connaître LISP, et encore moins son d'analyseur syntaxique,
    ce que vous semblez vouloir faire, du moins ce que j'en comprends,
    est parfaitement pris en charge par la définition appropriée des bonnes
    interfaces.

    C'est par ailleurs ce que les auteurs du langage implémentent eux mêmes.

    https://cs.opensource.google/go/go/+/refs/tags/go1.21.0:src/go/ast/ast.go;l=32

    Et ici la définition des types réel correspondant aux différents cas de déclarations
    que le langage supporte.
    https://cs.opensource.google/go/go/+/refs/tags/go1.21.0:src/go/ast/ast.go;l=596

    J'ai le même sentiment à la lecture de votre autre question,
    https://www.developpez.net/forums/d2151123/autres-langages/autres-langages/go/golang-mort/

    Je me permets d'y répondre ici car les deux cas me semblent très similaires
    dans la réponse apportée.

    Certes les unions de type ne sont pas disponible, mais encore une fois,
    l'utilisation du type `interface{}` en lieu et place de votre `struct` fournit
    le support de polymorphisme recherché.
    Dans votre exemple vous auriez implémenter un `switch` sur la valeur de `which`.
    Avec ce langage, vous `switchez` directement sur le type réel de la valeur.

    C'est documenté dans la spécification,
    https://go.dev/ref/spec#Type_switches
    https://go.dev/doc/effective_go#interface_conversions

    C'est un cas d'usage courant,
    https://cs.opensource.google/go/go/+/refs/tags/go1.21.0:src/go/ast/filter.go;l=60

    Bonne journée.

Discussions similaires

  1. polymorphisme et autre
    Par jbeauport dans le forum C++
    Réponses: 15
    Dernier message: 29/06/2005, 13h43
  2. [Language] polymorphisme, interface ...
    Par Ikit dans le forum Langage
    Réponses: 5
    Dernier message: 03/03/2005, 11h39
  3. Réponses: 15
    Dernier message: 25/01/2005, 16h51
  4. Surcharge et Polymorphisme
    Par Hell dans le forum C++
    Réponses: 6
    Dernier message: 12/01/2005, 20h50
  5. Réponses: 2
    Dernier message: 25/07/2004, 23h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo