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 :

Communication entre deux classes


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 82
    Points : 67
    Points
    67
    Par défaut Communication entre deux classes
    Bonjour,

    J'ai un petit problème de structure... Basique apparemment mais je dois être mal reveillé je ne vois pas de solution directe.

    Je veux faire communiquer deux classes sans les inclure l'une dans l'autre.

    Un exemple simple, avec une classe A1 et A2 qui sont chacune dérivées de A (ce qui n'est pas obligé mais ça va bien dans mon exemple).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    A est une classe "Personnage"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    A1 est un "Personnage" et possède un attribut Watch et une méthode getTime()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    A2 est un "Personnage" et possède un attribut Agenda et une méthode getAppointment(DateTime Time)
    A1 et A2 ne pouvant rien faire l'un sans l'autre (un a l'heure et l'autre le planning), il faut qu'ils puissent se parler. Inclure A1 en attribut de A2 (ou le contraire) ne me semble absolument pas cohérent, ce sont deux classes distinctes, il n'y a pas de hiérarchie. Comment faire ?

  2. #2
    Membre confirmé Avatar de jacky01
    Profil pro
    Développeur .NET
    Inscrit en
    Juin 2007
    Messages
    537
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2007
    Messages : 537
    Points : 527
    Points
    527
    Par défaut
    Bonjour,

    Si tu ne veut pas les inclure mutuellement, tu peu géré ca au amont.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    protected void MaFonction(){
     
       A1 _classe1 = new A1();
       A2 _classe2 = new A2();
     
       Datetime _heure = _classe1 .getTime();
       Datetime _date = _classe2 .getAppointment();
    }
    Après je ne sais pas trop comment tu compte utilisé ces informations, mais cette solution suppose la mise en place d'accesseur ou de méthode public s'il n'y a pas d'héritage.

    OU encore mettre en place des méthode static. Mais attention au static, il peut être traitre si tu ne maitrise pas ce modificateur.

  3. #3
    Membre du Club
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 82
    Points : 67
    Points
    67
    Par défaut
    C'est un peu ce que je vais faire au final... Ça m'embête quand même d'un point de vue structure. Après tout, il n'y a pas de Supérieur à A1 et A2 qui permet de les coordonner, ils devraient pouvoir le faire naturellement.

    Ou alors au contraire créer une classe Telephone qui permet de communiquer. Et structurer un simili protocole de com. Bon, ça serait beaucoup d'embêtement pour pas grand chose ^_^. Je vais rester dans la solution d'un supérieur coordinateur.

    Le static ne me sert pas à grand chose, la méthode getTime() dépend de l'attribut Watch qui peut changer selon les Personnes...

  4. #4
    Membre confirmé Avatar de jacky01
    Profil pro
    Développeur .NET
    Inscrit en
    Juin 2007
    Messages
    537
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2007
    Messages : 537
    Points : 527
    Points
    527
    Par défaut
    Et as-tu pensé au polymorphisme ? en mettant la classe Personnage abstraite et ainsi ta classe A1 implémenterais la méthode getTime() et A la méthode getAppointment().

    Ça peut être une solution je viens d'y pensé

  5. #5
    Membre du Club
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 82
    Points : 67
    Points
    67
    Par défaut
    A ne possède pas l'Agenda, seulement A2... (la classe mère est là uniquement pour bien visualiser mon exemple, en vrai c'est pas forcément le cas).

  6. #6
    Membre confirmé Avatar de jacky01
    Profil pro
    Développeur .NET
    Inscrit en
    Juin 2007
    Messages
    537
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2007
    Messages : 537
    Points : 527
    Points
    527
    Par défaut
    OK ba je apres je vois pas d'autre solution comme ca.

  7. #7
    Membre émérite
    Avatar de laedit
    Homme Profil pro
    Consultant études et développement
    Inscrit en
    Décembre 2006
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant études et développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 344
    Points : 2 265
    Points
    2 265
    Par défaut
    Sinon l'une des classes peut proposer des événements auxquels sera abonné la seconde.

  8. #8
    Membre habitué
    Avatar de crjo
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Octobre 2004
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 81
    Points : 132
    Points
    132
    Par défaut
    Hello,

    je ne suis pas sûr de bien comprendre ce que tu veux faire, mais je vais quand même essayer de te proposer qqch

    Si A1 et A2 ne peuvent rien faire l'un sans l'autre, ça ne me semble pas incohérent d'ajouter dans chacune de ces classes une référence à un objet de l'autre classe, sous forme de propriété par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class A1
    {
        public A2 RefA2 {get; set;}
     
        ...
    }
     
    class A2
    {
        public A1 RefA1 {get; set;}
     
        ...
    }
    et quand tu crées les instances, tu les relies entre elles :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    A1 unA1 = new A1();
    A2 unA2 = new A2();
     
    unA1.RefA2 = unA2;
    unA2.RefA1 = unA1;
    au sein de ta classe A1, tu peux maintenant appeler les fonctions publiques (voire les fonctions protégées) de l'objet A2, et vice-versa

    Bon, ok, les noms "RefA1" et "RefA2" ne sont pas top, mais bon, "A1" et "A2", ce n'est pas super parlant non plus

    I hope it helps...

  9. #9
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 194
    Points
    5 194
    Par défaut
    bonjour

    perso, pour un tel problème, j'éviterais la liaison croisée par référence mutuelle.. pourquoi ? si un jour tu changes les classes ou qu'une nouvelle classe à besoin d'être au "courant" des 2 autres, il faudra recoder

    Je pencherais plutot pour 2 classes qui ne se connaissent pas, mais qui eventuellement implémente des Interfaces connues des 2 classes. ET ensuite, je travaillerais avec de l'évenement pour "communiquer" entre les 2 classes

    Voir, un manager au dessus des 2 classes qui établit la relation entre les 2 classes en appelant les méthodes qui conviennent. Bref, puisque les 2 classes n'ont pas de relation hiérarchiques, autant faire quel soit gérer par une troisième classe que j'appelerai classe de "Synchronisation"

  10. #10
    Membre habitué
    Avatar de crjo
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Octobre 2004
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 81
    Points : 132
    Points
    132
    Par défaut
    Voir, un manager au dessus des 2 classes qui établit la relation entre les 2 classes en appelant les méthodes qui conviennent. Bref, puisque les 2 classes n'ont pas de relation hiérarchiques, autant faire quel soit gérer par une troisième classe que j'appelerai classe de "Synchronisation"
    +1

    C'est effectivement une manière plus propre de coder le truc, mais j'avoue que je n'ai pas tout à fait cerner ce que Luigicube voulait faire...

    Bon week-end à tous

  11. #11
    Membre du Club
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 82
    Points : 67
    Points
    67
    Par défaut
    J'avais pas vu les réponses - désolé.

    Pour theMonz on est d'accord, c'est pas terrible les références mutuelles, c'était mon intuition d'un point de vue abstrait mais comme tu le dis, pratiquement ça pose des limites.

    Citation Envoyé par theMonz
    Voir, un manager au dessus des 2 classes qui établit la relation entre les 2 classes en appelant les méthodes qui conviennent. Bref, puisque les 2 classes n'ont pas de relation hiérarchiques, autant faire quel soit gérer par une troisième classe que j'appelerai classe de "Synchronisation"
    C'est ce que j'ai dit que j'allais faire, c'est ce que j'ai fait :-)

    Citation Envoyé par laedit
    Sinon l'une des classes peut proposer des événements auxquels sera abonné la seconde.
    Surement la bonne solution. Après, je ne suis pas du tout familier avec ça... est-ce que ça ressemble aux évènements de type GUI implémentés de base dans les objets graphiques ?

    encore merci pour les réponses.

  12. #12
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 194
    Points
    5 194
    Par défaut
    oui absolument pour les event

    Tu déclares un delegate qui définit le prototype des fonctions qui seront appelées par l'evenement

    et dans ta classe, tu crées un Event du type du delegate précedemment crée.

    Reste plus ensuite qu'à faire un test genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public Event MyEventDelegate theMonz;
    et là ou tu appelles le code d'event faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(theMonz != null)
    {
       theMonz(argument définit dans le delegate);
    }

  13. #13
    Membre du Club
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 82
    Points : 67
    Points
    67
    Par défaut
    Je tacherai de me renseigner sur le sujet :-)

    Merci des réponses, je passe en résolu .

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

Discussions similaires

  1. Communication entre deux classes
    Par Einde dans le forum Qt
    Réponses: 1
    Dernier message: 23/06/2015, 11h02
  2. Réponses: 0
    Dernier message: 08/07/2013, 23h25
  3. Communication entre deux classes impossible
    Par juyn89 dans le forum Langage
    Réponses: 1
    Dernier message: 30/06/2012, 19h52
  4. [Débutant] Communication entre deux classes
    Par Gualino dans le forum VB.NET
    Réponses: 26
    Dernier message: 07/09/2011, 11h43
  5. Communication entre deux classes indépendantes
    Par hazem2410 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 01/12/2010, 21h12

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