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

Algorithmes et structures de données Discussion :

Probleme pour piger l'heritage


Sujet :

Algorithmes et structures de données

  1. #1
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 98
    Points : 50
    Points
    50
    Par défaut Probleme pour piger l'heritage


    Classe PIECE

    Attributs Privés :

    NumP : entier
    LibelleP : chaine

    Méthodes Publiques :

    Fonction getNumP() : entier

    FinClasse



    Classe PIECE DEFECTUEUSE

    Attributs Privés :

    NbHeuresMaintenanceNecessaire : entier

    Méthodes Publiques :

    Fonction getNbHeures() : entier

    FinClasse


    Salut,

    J'ai du mal à piger à l'héritage j'ai donc fait ce petit exemple en Héritage public en espérant que vous m'aidiez à éclaircir les points suivants :

    1) les attributs privés hérités de la classe PIECE (numP, libelleP) sont-ils accessibles par les méthodes publiques de la sous-classe?

    exemple :

    Fonction PIECE DEFECTUEUSE :: getNbHeures() : entier

    Debut

    // si maintenant bien que je n'en ai aucunne utilité dans cette fonction j'écrivais directement :

    numP

    // serait-ce incorrect ? dois-je nécessairement utiliser la fonction getNumP() ?

    Fin



    2) si je veux créer un objet de type "PIECE DEFECTUEUSE" je fais ainsi :

    unePieceDef : PIECE DEFECTUEUSE

    unePirceDef.init(01432, carburateur)

    ce qui signifie que :

    - dans un héritage on instancie jamais la classe mère?
    - on hérite toujours uniquement de : structure + définition de méthodes
    et jamais du contenu des champs (privés notemment)?

    Merci de me filer un coup d'main

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Août 2003
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 247
    Points : 276
    Points
    276
    Par défaut
    1. Correct oui. (En C++, les champs private ne sont pas visibles par les classes filles, il faut utiliser les champs protected si besoin est.)

    2. C'est au constructeur de la classe fille d'instancier la classe mère. Les constructeurs ne sont pas transmis par héritage.
    Quant au contenu des champs, il sont propres à une instance, et non à une classe. Il en sont donc pas transmis. Peut-être ai-je mal compris la question ?

    (En fait, je en connais que le C++ en langage OO. Les réponses peuvent être différentes dans des langages différents.)

  3. #3
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Idem que Selenite, je réponds pour le C++.

    les attributs privés hérités de la classe PIECE (numP, libelleP) sont-ils accessibles par les méthodes publiques de la sous-classe?
    Un attribut privé n'est jamais accessible en dehors de sa propre classe. La seule méthode serait d'utiliser "friend".

    - dans un héritage on instancie jamais la classe mère?
    Pas directement, mais c'est possible de façon indirect ce qui permet à la classe mère de contrôler son instanciation.

    - on hérite toujours uniquement de : structure + définition de méthodes
    et jamais du contenu des champs (privés notemment)?
    C'est souvent comme ça (sauf voir avec "friend").
    C'est le principe de la boîte noire. La classe mère va faire des choses et que moins tu en sais et mieux ce sera.

    PS: Après ça se complique un peu avec le polymorphisme, les membres statiques, etc...

  4. #4
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 98
    Points : 50
    Points
    50
    Par défaut
    Merci pour votre aide.

    Cependant je m'appercois que je me suis mal exprimé dans ma question sur l'accessibilité des attributs privés :

    Dans la définition de "PIECE DEFECTUEUSE :: getNbHeures() : entier" ma question est de savoir si je peux accéder directement à l'attribut "NumP" de la sous-classe "PIECE DEFECTUEUSE" et non au "NumP" de la classe Mere "PIECE"?

    Mais je suppose que ma question est idiote puisque dans la mesure où la classe mère n'est pas instanciée il n'y a pas de raison de vouloir accéder à ses attributs privés?

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Août 2003
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 247
    Points : 276
    Points
    276
    Par défaut
    La classe mère est instanciée. En C++, ses membres protected sont accessible à partir de la classe fille, ses membres private ne le sont pas.

  6. #6
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    "NumP" de la sous-classe "PIECE DEFECTUEUSE" .... "NumP" de la classe Mere "PIECE"
    Je crois qu'il y a confusion de ta part.

    Il n'existe qu'un seul "NumP", celui de la classe mère. Ce que tu dois comprendre c'est que la classe mère et la classe fille telle que tu les a définis, sont deux objects distincts (même s'il y a une sorte de fusion lors de l'héritage). Je dirais que ce sont des classes concrètes dans le sens C++.

    Le principe (toujours en C++) c'est que lorsque tu construit un objet "PIECE DEFECTUEUSE" alors le constructeur de "PIECE" est appelé en premier. C'est-à-dire que d'abord "PIECE" est construit puis "PIECE DEFECTUEUSE".
    Et si "PIECE" héritait d'une autre classe alors le constructeur de cette autre classe serait aussi appelé et en premier.

    Construire un objet ne veut pas forcément dire remplir ces champs. Ceci veut juste dire que l'objet existe en mémoire et qu'il est utilisable par le programme au moment de son instanciation.

    Je te disais plus haut que l'on pouvait instancier la classe mère de façon indirecte. En fait tu as plusieurs méthodes que l'on utilise suivant les besoins du programme. Je te donne un exemple en C++, mais je ne sais pas dans quel langage tu programmes.

    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    #include <string>
    using std::string;
     
    class PIECE{
     
      public:
     
    				// Un constructeur par defaut
    				PIECE() : m_iNumP(0), m_szLibelle("") {}
     
    				// Un constructeur qui permet de remplir les champs lors de l'instanciation
    				PIECE(int iNumP, string szLibelle) : m_iNumP(iNumP), m_szLibelle(szLibelle){}
     
    				// Le destructeur
    				virtual ~PIECE(){}
     
    				// Methode pour récupérer le nombre de pièce de la classe mère
    				int  GetNumPiece()                     { return m_iNumP; }
     
    				// Methode pour initialiser le membre m_iNumP
    				void  SetNumPiece(int iNumP)           { m_iNumP = iNumP; }
     
    				// Methode pour initialiser le membre m_szLibelle
    				void  SetLibelle(string szLibelle)     { m_szLibelle = szLibelle; }
     
    				// Cette méthode permet d'initialiser les valeurs de la classe après son instanciation
    				void Init(int iNumP, string szLibelle) { m_iNumP = iNumP; m_szLibelle = szLibelle; }
     
    		private:
     
    				// Les membres privés
    				int    m_iNumP;
    				string m_szLibelle;
    };
     
    class PIECE_DEFECTUEUSE : public PIECE{
     
      public:
     
    				// Un constructeur par defaut
    				PIECE_DEFECTUEUSE() : m_iNumHeureMaintenance(0) {}
     
    				// Un constructeur qui pemet d'initialiser le membre m_iNumHeureMaintenance
    				PIECE_DEFECTUEUSE(int iNumHeureMaintenance) : m_iNumHeureMaintenance(iNumHeureMaintenance) {}
     
    				// Un constructeur qui pemet d'initialiser tous les membres même ceux de la classe mère
    				PIECE_DEFECTUEUSE(int iNumHeureMaintenance, int iNumP, string szLibelle) : 
    				                  PIECE(iNumP, szLibelle), m_iNumHeureMaintenance(iNumHeureMaintenance) {}
     
    				// Le destructeur
    				~PIECE_DEFECTUEUSE(){}
     
    				// Methode pour récupérer le nombre d'heure de la classe fille
        int GetNumHeure()                         { return m_iNumHeureMaintenance; }
     
    				// Methode pour initialiser le nombre d'heure
    				void SetNumHeure(int iNumHeureMaintenance) { m_iNumHeureMaintenance = iNumHeureMaintenance; }
     
    		private:
     
    				// Le membre privé
    				int m_iNumHeureMaintenance;
    };
     
    void main(){
     
    		// Voici des exemples pour utiliser les différents constructeurs des deux classes
     
    		// Tu as besoin d'un objet PIECE_DEFECTUEUSE mais tu ne sais pas encore quelles sont les valeurs
    		PIECE_DEFECTUEUSE cPieceDefectueuse1;
     
    		// Plus tard dans ton programme tu remplis les champs de cette classe
    		cPieceDefectueuse1.SetNumHeure(2);
    		cPieceDefectueuse1.Init(1, "carburateur");
     
     
    		// Tu as besoin d'un objet PIECE_DEFECTUEUSE mais tu ne connais que le nombre d'heures de maintenance
      PIECE_DEFECTUEUSE cPieceDefectueuse2(2);
     
    		// Plus tard dans ton programme tu remplis les champs de la classe mère
    		cPieceDefectueuse1.Init(1, "carburateur");
     
    		// Mais tu pourrais utiliser des méthodes distinctes
    		cPieceDefectueuse1.SetNumPiece(1);
    		cPieceDefectueuse1.SetLibelle("carburateur");
     
    		// Ici on construit l'objet entièrement et tous les champs sont remplis à l'instanciation
    		PIECE_DEFECTUEUSE cPieceDefectueuse3(2, 1, "carburateur");
    }

Discussions similaires

  1. [debutant] Probleme pour dessiner un simple cube
    Par scorpiwolf dans le forum DirectX
    Réponses: 6
    Dernier message: 02/07/2003, 20h29
  2. [LG]Divers problémes pour un programme.
    Par Horus TCT dans le forum Langage
    Réponses: 14
    Dernier message: 24/05/2003, 23h04
  3. Probleme pour les insertion au format etranger
    Par Sandrine75 dans le forum XMLRAD
    Réponses: 5
    Dernier message: 19/03/2003, 10h55
  4. [Kylix] probleme pour lancer le shell
    Par miky dans le forum EDI
    Réponses: 5
    Dernier message: 13/08/2002, 09h39
  5. Réponses: 2
    Dernier message: 30/05/2002, 08h54

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