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

C Discussion :

Classe abstraite en C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 36
    Par défaut Classe abstraite en C
    Bonjour,

    Je suis entrain de créer un compilateur(convertisseur) qui convertie mon langage de programmation en langage C.
    Comme dans tout les languages récents, il existe les fameuses classes abstraites "abstract class", et je souhaite donc les intégrer.
    Je viens de créer un petit exemple en langage C et je souhaiterais savoir si pour vous, ce code représente bien une classe abstraite ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
    typedef struct _Animal Animal;
    typedef struct _Chat Chat;
     
    // Classe abstraite
    struct _Animal {
    	void* pDerivedObj;
    	void (*dit_bonjour) (Animal* self);
    };
     
    // Classe normale
    struct _Chat {
    	Animal* parent;
    };
     
    Animal* animal_construct ()
    {
    	Animal* pObj = NULL;
    	pObj = (Animal*)malloc(sizeof(Animal));
    	return pObj;
    }
     
    void animal_dit_bonjour (Animal* obj) {
    	obj->dit_bonjour(obj);
    }
     
    void chat_dit_bonjour (Animal* self)
    {
    	printf("Miaou Miaou Miaou\n");
    }
     
    Chat* new_Chat()
    {
            Chat* chat = NULL;
    	Animal* animal = NULL;
     
    	animal = animal_construct ();
    	chat = malloc(sizeof(chat));
     
            chat->parent = animal;
    	animal->pDerivedObj = chat;
    	animal->dit_bonjour = chat_dit_bonjour;
     
    	return chat;
    }
     
    int main()
    {
    	Chat* Obj = new_Chat();
    	animal_dit_bonjour ((Animal*) Obj->parent);
    	return 0;
    }
    Je vous remercie d'avance pour votre réponse.
    Cordialement,
    Nicolas.

  2. #2
    Membre expérimenté Avatar de brachior
    Homme Profil pro
    Doctorant
    Inscrit en
    Mai 2011
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Doctorant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2011
    Messages : 190
    Par défaut
    Y a un intérêt particulier à garder l'objet dérivé ?
    Sinon pour l'implémentation, je verrai un typedef :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    #include <stdio.h>
    #include <stdlib.h>
     
     
    /* Classe abstraite */
    struct _Animal {
    	void (*dit_bonjour) ();
    };
     
    typedef struct _Animal Animal;
     
    /* Classe normale */
    typedef Animal Chat;
     
    Animal* animal_construct ()
    {
    	return (Animal*)malloc(sizeof(Animal));;
    }
     
    void chat_dit_bonjour ()
    {
    	printf("Miaou Miaou Miaou\n");
    }
     
    Chat* new_Chat()
    {
    	Chat* chat = animal_construct ();
    	chat->dit_bonjour = chat_dit_bonjour;
     
    	return chat;
    }
     
    int main()
    {
    	Chat* Obj = new_Chat();
    	Obj->dit_bonjour();
    	return 0;
    }
    Ça me semble plus cohérent sur le principe d'héritage ...
    Après est ce que c'est mieux ... ^^

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 36
    Par défaut
    Salut Jérôme,

    Effectivement c'est plus cohérent et plus rapide à écrire.
    Merci pour ta réponse.

    Nicolas.

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Et on peut (moi je le recommande) même remplacer :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    /* Classe abstraite */
    struct _Animal {
    	void (*dit_bonjour) ();
    };
     
    typedef struct _Animal Animal;

    par

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /* Classe abstraite */
    typedef struct _Animal {
    	void (*dit_bonjour) ();
    } Animal ;

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 36
    Par défaut
    Bonjour "souviron34"

    Oui effectivement on peut l'écrire comme ça aussi.
    Mais est-ce que ça change vraiment quelques choses (mis à part qu'il y ait moins de ligne) pour l'exécution ?

    Nicolas.

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par nikobordx Voir le message
    Bonjour "souviron34"

    Oui effectivement on peut l'écrire comme ça aussi.
    Mais est-ce que ça change vraiment quelques choses (mis à part qu'il y ait moins de ligne) pour l'exécution ?

    Nicolas.
    Salut
    Non, ça ne change rien à l'exécution. Juste élimination des redondances inutiles quoi.
    Accessoirement, il est conventionnellement recommandé de nommer ses structures "s_" et ses types "t_".

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct s_Animal {
    	void (*dit_bonjour) ();
    } t_Animal ;
    typedef t_Animal t_Chat;

    Voire même ne pas mettre de nom inutile s'il n'est pas réutilisé
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct {
    	void (*dit_bonjour) ();
    }  t_Animal ;
    typedef t_Animal t_Chat;
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre expérimenté Avatar de brachior
    Homme Profil pro
    Doctorant
    Inscrit en
    Mai 2011
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Doctorant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2011
    Messages : 190
    Par défaut
    Étant donné qu'il converti d'un langage à un autre,
    Il faut voir si c'est pas trop compliqué/énervant/... de suivre proprement les conventions ^^
    Tout dépend si le fichier C final peut être relu ou s'il sert juste pour la compilation ...

Discussions similaires

  1. [Debutant] Une classe abstraite en parametre ?
    Par kiroukou dans le forum Débuter
    Réponses: 8
    Dernier message: 03/02/2005, 15h05
  2. [Débutant(e)] toString + classes abstraites
    Par debdev dans le forum Langage
    Réponses: 9
    Dernier message: 26/01/2005, 15h22
  3. [Debutant][Conception] Classes abstraites et interface.
    Par SirDarken dans le forum Langage
    Réponses: 4
    Dernier message: 29/10/2004, 00h02
  4. Classe abstraite / MVC
    Par caramel dans le forum MVC
    Réponses: 5
    Dernier message: 01/04/2003, 09h27
  5. pb constructeurs classes dérivant classe abstraite
    Par Cornell dans le forum Langage
    Réponses: 2
    Dernier message: 10/02/2003, 19h02

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