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 :

Instance de classe à l'intérieur d'une autre


Sujet :

C#

  1. #1
    En attente de confirmation mail
    Inscrit en
    Janvier 2007
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 70
    Points : 60
    Points
    60
    Par défaut Instance de classe à l'intérieur d'une autre
    Bonjour à tous,

    J'ai une classe Document et une classe Employee. J'utilise régulièrement ces deux classes indépendamment à travers mon code. Parfois je dois faire des manipulation seulement sur un objet de type Employee.

    Cependant, ma classe Document a impérativement besoin d'un instance d'Employee (un document est créé par un et un seul employé).

    Je ne peux déclarer une inner class Employee à Document, puisque je veux continuer de traiter Employee de façon indépendante ailleurs dans mon code.

    J'aimerais seulement pouvoir avoir une instance d'Employee à l'intérieur de Document à l'instanciation de cette dernière.

    Actuellement, dans ma classe document, j'ai une variable membre (Employee employee) et j'instancie cet objet dans le constructeur de Document. Il est évident qu'à la création de Document, Employee est vide.

    Mon problème est que je ne sais pas la meilleure (la plus intelligente) façon d'accéder les propriétés de Employee via Document.

    J'ai trouvé deux "solutions" :

    1. Ma variable membre de type Employee est publique et j'accède les infos de l'employee de cette facon : document.Employee.FirstName, document.Employee.LastName. Le problème avec cette méthode est que je ne suis pas certain si c'est sécuritaire ?

    2. Je tire profit de l'encapsulation en créant des propriétés à Document pour toutes celles de Employees : Document.EmployeeFirstName, Document.EmployeeLastName. Le problème avec ça, c'est qu'à chaque fois que j'ajoute ou supprime une propriété de la classe Employee, je dois faire de même dans la classe Document.

    Je suis certain de ne pas etre le seul à avoir à intégrer des classes à l'intérieur d'autres classes. Mon code peut fonctionner en utilisant n'importe laquelle des deux méthodes ci-haut, seulement, j'aimerais savoir quelle est la méthode la plus efficace à long terme.

    Merci d'avance pour vos suggestions et explications,

  2. #2
    Membre éclairé
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2007
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 574
    Points : 751
    Points
    751
    Par défaut
    J'ai pas tout saisi, mais,
    Classe Document :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    private Employe employe = null;
    public Document(Employe e) 
    {
        this.employe = e;
    }
    Après dans ta classe document tu as accès à toute la classe employé via l'instance employe.
    Je sais pas si ça répond à ta question?
    En gros tu peux accèder de deux manière à une instance d'objet. Soit tu le passe au constructeur (méthode ci-dessus) soit tu le déclare static (ou singleton), auquel cas tu y accède en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Emplote employe = Employe.GetEmploye()

  3. #3
    En attente de confirmation mail
    Inscrit en
    Janvier 2007
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 70
    Points : 60
    Points
    60
    Par défaut
    Oui c'est comme ça que je fonctionne actuellement. Tu sembles suggérer que je me crée une méthode pour retourner la classe "contenue" (Document.GetEmployee() qui retournera ma classe employee)

    Ne serait-ce pas mieux de carrément créer une propriété pour ma classe contenue ?

    Classe Document ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public Employee Employee (bon ici je devrais changer le nom pour éviter une erreur)
            {
                get { return employee; }
                set { employee = value; }
            }
    Donc de rendre l'accès à la classe toute entière est une meilleure idée que d'encapsuler toutes ses propriétés via la classe qui la contient ?

    (Dans quels cas il est préférable de créer une méthode get au lieu d'une propriété, de toute facon ?)

  4. #4
    Membre éclairé
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2007
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 574
    Points : 751
    Points
    751
    Par défaut
    Je reprends depuis le début...
    Quand tu veux utiliser une instance de classe dans une autre classe (ce qui semble être ton cas) :
    J'aimerais seulement pouvoir avoir une instance d'Employee à l'intérieur de Document à l'instanciation de cette dernière.
    La méthode usuelle est de passer l'instance de l'objet au constructeur de l'autre.
    Ainsi, tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Employe emp = new Employe();
    Document doc = new Document(emp);
    Ainsi dans ta classe Document, tu as accès à toutes les méthodes de emp (instance d'Employe).
    Pour ce faire ta classe document doit ressembler à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class Document {
        private Employe e = null;
        public Document(Employe e)
        {
            this.e = e;
        }
     
         //Tout le code que tu veux
        //Par exemple String s = e.FirstName;
    }
    L'autre méthode (static) est utilisé (pour généraliser) seulement dans les cas de bibliothèques communes à toutes tes classes.
    Compris?

  5. #5
    En attente de confirmation mail
    Inscrit en
    Janvier 2007
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 70
    Points : 60
    Points
    60
    Par défaut
    Oui je comprends. Mais ton exemple ne démontre que la façon d'écrire dans la classe Document.

    Ma question est pour lire une propriété de la classe Employee en passant par la classe qui la contient (Document).

    Si, à un autre endroit dans mon code, je veux retrouver le FirstName de l'employee de tel Document, est-ce que :

    // Admettons que j'ai rempli mon objet Document et son objet Employee ...
    document.Employee.FirstName

    est la bonne façon de faire ?

    Je veux dire que je n'ai pas créé de propriétés dans Document pour encapsuler les propriétés de Employee (par exemple, si je ne voulais pas que Document aie accès à EmployeeID mais à FirstName et LastName, j'aurais pu créer les propriétés EmployeeFirstName et EmployeeLastName à Document, qui pointent au bon endroit.

    Je ne sais pas si je m'explique bien....

    Merci encore

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    je ne vois pas trop le sens de mettre une méthode statique GetEmployee()... ça voudrait dire qu'il n'y a qu'un employé ???

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par cobolfingaz Voir le message
    // Admettons que j'ai rempli mon objet Document et son objet Employee ...
    document.Employee.FirstName

    est la bonne façon de faire ?
    Oui... pas la peine de chercher plus compliqué
    Quoique personnellement j'aurais créé une propriété pour Employee, j'aime pas trop laisser des champs publics... en plus comme a priori tu n'as pas besoin de changer l'employé d'un document existant, tu peux rendre la propriété ReadOnly:
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class Document {
        private Employe employee = null;
        public Employee Employee
        {
            get { return employee; }
        }
        public Document(Employe e)
        {
            this.employee = e;
        }
    }

  8. #8
    Membre éclairé
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2007
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 574
    Points : 751
    Points
    751
    Par défaut
    Dans le reste du code tu accèdes au info via l'instance de emp.
    Employe emp = new Employe();
    Document doc = new Document(emp);
    Pour simplifier, l'objet emp est présent en dehors de la classe Document (via l'instance emp) et dans la classe document (via l'instance de e).
    C'est le même objet. Tu n'as donc pas besoin d'y accèder via Document. Que tu fasses :
    En dehors de Document :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String s = emp.FirstName;
    ou dans Document :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String s2 = e.FirstName
    Tu auras la même chose ( ce qu'il y aura dans s et s2 sera identique).
    Bon courage...

  9. #9
    Membre éclairé
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2007
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 574
    Points : 751
    Points
    751
    Par défaut
    Bien joué Tomlev, c'est ce qu'il voulait je pense.
    J'avais pas compris...

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Si je peux me permettre, la formulation de dahtah est inexacte... il n'y a pas une "instance emp" et une "instance e", c'est la même instance... emp et e sont 2 références vers la même instance de la classe Employee.
    Par contre ça s'écarte un peu du sujet il me semble...

  11. #11
    En attente de confirmation mail
    Inscrit en
    Janvier 2007
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 70
    Points : 60
    Points
    60
    Par défaut
    Vous avez très bien répondu à mes questions.

    Merci beaucoup à vous !

  12. #12
    Membre éclairé
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2007
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 574
    Points : 751
    Points
    751
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Si je peux me permettre, la formulation de dahtah est inexacte... il n'y a pas une "instance emp" et une "instance e", c'est la même instance... emp et e sont 2 références vers la même instance de la classe Employee.
    Tout à fait d'accord, mais c'est compliqué d'expliquer simplement aux débutants sans les noyer dans un jargon POO.

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par dahtah Voir le message
    Tout à fait d'accord, mais c'est compliqué d'expliquer simplement aux débutants sans les noyer dans un jargon POO.
    Certes... mais d'un autre côté il vaut mieux éviter de leur mettre des idées fausses dans la tête, c'est pourquoi je tenais à corriger

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Exécuter une classe à l'intérieur d'une autre classe
    Par messi1987 dans le forum Débuter avec Java
    Réponses: 8
    Dernier message: 14/01/2014, 08h16
  2. Réponses: 2
    Dernier message: 27/05/2008, 16h59
  3. Réponses: 4
    Dernier message: 03/05/2008, 09h56
  4. Réponses: 14
    Dernier message: 04/12/2005, 08h08
  5. Réponses: 2
    Dernier message: 10/12/2004, 15h43

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