Généricité et interface en C ...

Signaler
Messages postés
514
Date d'inscription
mercredi 19 mars 2003
Statut
Membre
Dernière intervention
1 mars 2009
-
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
-
Salut à tous !
Alors voilà ... Je me demandais tout à l'heure comment faire pour avoir une interface en C (une sorte d'objet abstrait dont on ne connait que le nom des méthodes). Du coup, j'ai eu une petite idée et j'ai écrit ça :

main.c :
#include <stdio.h>
#include <stdlib.h>

typedef struct sEntier *Entier;
struct sEntier
{
   int Valeur;
   void(*ecrire)(Entier);
};

void Entier_ecrire(void *n)
{
   Entier m = (Entier)n;
   printf("%d", m -> Valeur);  
}

typedef struct sReel *Reel;
struct sReel
{
   float Valeur;
   void(*ecrire)(Reel);
};

void Reel_ecrire(void *x)
{
   Reel y = (Reel)x;
   printf("%f", y -> Valeur);
}

typedef struct sWritable *Writable;
struct sWritable
{
   int Valeur;
   void(*ecrire)(void *);
};

void ecrire(void *e)
{
   Writable i = (Writable)e;
   i -> ecrire(i);
}

int main(int argc, char *argv[])
{
   Entier k = (Entier)malloc(sizeof(struct sEntier));
   k -> ecrire = Entier_ecrire;
   k -> Valeur = -6;
  
   Reel y = (Reel) malloc (sizeof(struct sReel));
   y -> ecrire = Reel_ecrire;
   y -> Valeur = 5.6;
  
   printf("k="); ecrire(k); printf("\n");
   printf("y="); ecrire(y); printf("\n");
}

Et en fait ... Bah ça marche. Alors ma question, c'est ... Est-ce que c'est propre ? Non parce que ... Bah je sais pas. Pour moi, là, ça tiens un peu de la magie quand même. Mais si c'est propre, je crois que ça pourra servir aux plus tordus d'entre nous !
Merci de vos commentaires !
L.S.

3 réponses

Messages postés
514
Date d'inscription
mercredi 19 mars 2003
Statut
Membre
Dernière intervention
1 mars 2009

Petite erreur de ma part : il faut remplacer dans les structures sEntier et sReel le paramètre des pointeurs de fonctions *ecrire par void *. Bah oui ... Sinon ... Bah ça marche pas  !
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Le pb est C, c'est que ya pas de controle de type avec ces pointeurs void. Mais sinon, je vois pas de pb.


Enfin je sais pas si on peut appeler vraiment ca générique, on utilise
les macro en général en C pour faire du généric mais pas sur des
classes entières.
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
Je vois pas bien le rapport avec "interface", qui doit etre une sorte d'objet abstrait dont on peut dériver quelque chose de plus concret, alors que là c'est directement entier ou réel, pas d'abstraction...
Sinon ça doit pouvoir servir  à quelque chose.
En C, les interfaces COM utilisent IDL (interface definition langage) et le compilateur MIDL qui permettent vraiment de "l'objet" en C.