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 :

Passer un objet en paramètre de méthode qui peut être de différents types


Sujet :

C#

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 40
    Points : 23
    Points
    23
    Par défaut Passer un objet en paramètre de méthode qui peut être de différents types
    Chers développeurs,

    Mon problème est que je souhaite savoir s'il est possible de passer un objet en paramètre de méthodes en indiquant qu'il peut être de différents types. Le but de ma méthode est de pouvoir redimensionner un objet qu'elle que soit son type, 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
    14
    15
    16
    17
     
    public void Menu_Load()
    {
          /* J'ai dessiné dans le design 1 bouton (buton_1) 1 label (lb_1) et un radiobuton (rb_1) */
     
          Redim_objet(buton_1);
          Redim_objet(lb_1);
          Redim_objet(rb_1);
    }
     
    public void Redim_objet(object O_modifier)
    {
           O_modifer.Height = 40;
           O_modifier.Width = 60;
           O_modifier.Top = 100;
           O_modifier.Left = 50;
    }
    Le problème vient de la méthode Redim_objet car en mettant un paramètre de type objet je ne peux pas atteindre la taille, la hauteur ou autre de l'objet, comment puis-je faire pour accéder aux propriétés d'un objet qui peut être de différents types ?

    Merci d'avance

  2. #2
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    Bonjour,

    Soit tes différent types implémentent une interface (dérive d'une classe) commune qui fournit ces propriétés. Dans ce cas, tu utilise cette interface (classe) pour ta méthode "Redim_objet"

    Soit tu passes par de la réflexion pour vérifier que les propriétés existe, et dans ce cas, venir "setter" la valeur que tu veux.

    La réflexion c'est lent, c'est pénible à utiliser, alors si tu peux avoir une interface fait une interface.

  3. #3
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 485
    Points
    5 485
    Par défaut
    Ou alors on peut simplement passer par le mot-clé dynamic.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public void Redim_objet(dynamic O_modifier)
    {
           O_modifer.Height = 40;
           O_modifier.Width = 60;
           O_modifier.Top = 100;
           O_modifier.Left = 50;
    }
    Cela étant dit, attention : si ces objet sont de purs objets C# sur lesquels on possède un contrôle, avoir besoin de recourir à cette astuce révèle un design défectueux. Comme Antoine l'a expliqué, l'utilisation d'interfaces est beaucoup plus propre et rapide : l'usage de dynamic met en oeuvre toute une plomberie coûteuse en ressources.

  4. #4
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 40
    Points : 23
    Points
    23
    Par défaut
    Je suis nouveau dans le monde du développement et je n'ai pas tout compris à ta réponse, sinon je peux faire de la surcharge de méthode avec 8 fois la même méthode qui accepte 8 paramètres différents? Cela ne fait pas très propre sachant qu'il y aura exactement le même code dans les 8 méthodes, il y aura seulement les paramètres qui changeront...

    exemple:

    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
     
    public void Redim_objet(Button O_modifier)
    {
           O_modifer.Height = 40;
           O_modifier.Width = 60;
           O_modifier.Top = 100;
           O_modifier.Left = 50;
    }
     
    public void Redim_objet(Label O_modifier)
    {
           O_modifer.Height = 40;
           O_modifier.Width = 60;
           O_modifier.Top = 100;
           O_modifier.Left = 50;
    }
     
    public void Redim_objet(Panel O_modifier)
    {
           O_modifer.Height = 40;
           O_modifier.Width = 60;
           O_modifier.Top = 100;
           O_modifier.Left = 50;
    }
    ....

  5. #5
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 485
    Points
    5 485
    Par défaut
    Non, pas besoin.
    En fait, tu souhaites donc redimensionner des contrôles (WinForms je présume) ? C'est très simple, ceux-ci héritent tous de Control. Et c'est cette classe qui déclare les propriétés que tu veux modifier. Donc il te suffit de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public void Redim_objet(Control O_modifier)
    {
           O_modifer.Height = 40;
           O_modifier.Width = 60;
           O_modifier.Top = 100;
           O_modifier.Left = 50;
    }
    Tu pourras passer à cette méthode n'importe quel contrôle, qu'il s'agisse d'un Label, d'un Button, ou autre : n'importe quel objet héritant de Control. Voilà, c'est à ça que sert le polymorphisme (l'héritage) ! Entre autres... Je te conseille de trouver un cours à ce sujet pour bien comprendre l'héritage et les interfaces.

  6. #6
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2008
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 200
    Points : 819
    Points
    819
    Par défaut
    Etant donnée que tu veux pouvoir redimensionner des controles. Pourquoi tu n'indique pas simplement que ta méthode accepte un objet de type control?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    public void Redim_objet(control O_modifier)
    {
           O_modifer.Height = 40;
           O_modifier.Width = 60;
           O_modifier.Top = 100;
           O_modifier.Left = 50;
    }

  7. #7
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2008
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 200
    Points : 819
    Points
    819
    Par défaut
    Bravo DonQuiche, tu as été le plus rapide

  8. #8
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 485
    Points
    5 485
    Par défaut
    Citation Envoyé par ElJipi Voir le message
    Bravo DonQuiche, tu as été le plus rapide
    On m’appelle Lucky Coder, de l'est au Far-West...

  9. #9
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 40
    Points : 23
    Points
    23
    Par défaut
    Oui c'est pas mal du tout par contre je veux récupérer les valeurs rentrer dans le design (quand on désigne la form "à la main "sous Visual Studio") comme un this.Width par contre lorsque je passe l'objet en paramètre les valeurs varient de quelques pixels, est-ce normal?

  10. #10
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 40
    Points : 23
    Points
    23
    Par défaut
    Ma question plus simplement formulée est la suivante :

    Comment récupère t-on la valeur renseignée dans le Design lors du dessin "à la main du produit"

    Car dans la code suivant au premier Height j'aurai bien la hauteur du Design mais ensuite j'aurais la valeur 50, comment retrouver la valeur du Design une fois la hauteur modifier manuellement?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public void Menu_Load()
    {
          int taille = 0;
          taille = this.Label1.Height;  /*** Taille dans le Design ***/
          Label1.Height = 50;
          taille = this.Label1.Height;  /*** Taille de 50 ***/
          taille = .....   /*** Je veux retrouver ma taille de base ***/
    }
    Dans les ... il me manque le code pour récupérer la valeur de départ qu'il y a dans le Design.

  11. #11
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 485
    Points
    5 485
    Par défaut
    Il n'y a pas d'autre solution que de stocker soi-même la taille de départ. Par exemple dans la propriété Tag de chaque contrôle (cette propriété sert à stocker des données persos, c'est un champ de type object, on peut donc y mettre n'importe quoi).

  12. #12
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 177
    Points : 4 489
    Points
    4 489
    Par défaut
    Citation Envoyé par spfo Voir le message
    Ma question plus simplement formulée est la suivante :

    Comment récupère t-on la valeur renseignée dans le Design lors du dessin "à la main du produit"

    Car dans la code suivant au premier Height j'aurai bien la hauteur du Design mais ensuite j'aurais la valeur 50, comment retrouver la valeur du Design une fois la hauteur modifier manuellement?
    Euh moi je me demande surtout pq tu veux celà

    Au pire il suffit de stocker l'information de la taille de la windows et pas de chaque control
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  13. #13
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 40
    Points : 23
    Points
    23
    Par défaut
    En faite je veux stocker les dimensions (Height, Width, Top, Left) car je travaille sur une application qui doit tourner sur plusieurs appareils qui n'ont pas la même taille d'écran mais où je veux que le design soit respecté sur chaque appareil.

    Donc c'est pour cela que je souhaite travailler en pourcentages calculés sur les valeurs du Design et prenant en compte la taille de l'écran sur laquelle elle tourne afin d'avoir une même identité visuelle sur chaque appareil.

  14. #14
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 177
    Points : 4 489
    Points
    4 489
    Par défaut
    Euh si l'application est bien faite les champs se resizent automatiquement
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  15. #15
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 40
    Points : 23
    Points
    23
    Par défaut
    Euh non cela ne se fait pas automatiquement, si seulement...

Discussions similaires

  1. Passer un objet en paramètre
    Par adrix26 dans le forum Services Web
    Réponses: 1
    Dernier message: 24/04/2009, 12h20
  2. Passer des objets en paramètre
    Par The eye dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 04/01/2008, 16h07
  3. Réponses: 4
    Dernier message: 20/06/2007, 17h34
  4. [POO] débutant passer un objet en paramètre
    Par samplaid dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 02/05/2006, 12h46
  5. [JACOB] Comment passer un objet par référence à une méthode
    Par zlavock dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 21/03/2005, 18h28

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