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 :

Surcharge opérateur classique


Sujet :

C#

  1. #1
    Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2007
    Messages : 126
    Points : 57
    Points
    57
    Par défaut Surcharge opérateur classique
    Bonjour,

    je voudrais si c'est possible de surcharger des opérateurs classiques (+,-,==,...) pour des classes qui existent déjà?

    Dans la plupart des tutoriaux, on ne parle des surcharges que pour des classes que l'on crée, or moi je voudrais par exemple créer la fonction "+" pour le type "object". Si c'est possible, où mettre la nouvelle définition.

    J'ai mis le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static object operator+ (object O1,object O2)
    dans la classe où j'ai besoin, mais j'ai l'erreur suivante:
    Un des paramètres d'un operateur binaire doit être le type conteneur.
    Merci pour votre aide.

  2. #2
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Ce n'est pas possible et cela n'aurait pas de sens de toute façon.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 14
    Points : 15
    Points
    15
    Par défaut
    Bonjour,

    J'ai la même erreur en écrivant ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public static DelegateMouse operator +(DelegateMouse a, DelegateMouse b)
    {
    ...
    }
    Vous aurez compris qu'il s'agit de délégués et que j'aimerais surcharger l'opérateur +
    Pourquoi ? Parce que je ne veux pas ajouter une fonction dans le délégué si elle y est déjà !

    Si on a ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    eventMouseDown += mouseDown;
    eventMouseDown += mouseDown;
    Je ne veux pas que le second fonctionne, il doit rester sans effet. J'ai la fonction qui cherche mais c'est une simple fonction, il faudrait que je remplace tous mes += sur mes délégués
    Alors qu'avec une surcharge, je serais tranquille.

    La doc MSDN indique ceci pour cette erreur de compilation :
    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
    public class iii
    {
        public static implicit operator int(iii x)
        {
            return 0;
        }
        public static implicit operator iii(int x)
        {
            return null;
        }
        public static int operator +(int aa, int bb)   // CS0563 
        // Use the following line instead:
        // public static int operator +(int aa, iii bb)    
        {
            return 0;
        }
        public static void Main()
        {
        }
    }
    Mais ça reste peu compréhensible pour moi ... qu'est ce que c'est que ce type "iii" ? Je vois bien que c'est la classe dans laquelle on se trouve mais bon ... je ne comprends pas, alors que le C++ accepte parfaitement ce genre d'opérateur

    Quelqu'un a une idée pour faire fonctionner ma surcharge ?
    Serait-ce impossible du fait que ce sont des délégués ?

  4. #4
    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
    salut

    si tu veux faire cela pour un delegate (enfin, un evenement) regardes du coté de add/remove.. tu verras, pas besoin de surcharge pour arriver à n'avoir qu'un seul delegate d'enregistrer à ton evenement

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 14
    Points : 15
    Points
    15
    Par défaut
    Mes délégués ne m'offrent pas ces méthodes, ils semblent en lecture seule
    Je peux récupérer la liste des fonctions enregistrée avec getInvocationList() mais aucune méthode d'ajout ou de suppression là dedans !
    Cette liste d'invocation peut me fournir un énumérateur mais toujours aucune opération de modification disponible

  6. #6
    Membre confirmé Avatar de MetalGeek
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 412
    Points : 513
    Points
    513
    Par défaut
    Salut,
    tu peux déclarer des corps "add" et "remove" pour tes évènements ; de toute façon "surcharger" les opérateurs des types clr que tu n'as pas créés, si cela était possible, serait à bannir.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 14
    Points : 15
    Points
    15
    Par défaut
    A ce jour, j'ai ça :
    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
    public delegate void DelegateMouse(MouseEventArgs e);
     
    public DelegateMouse addDelegate(DelegateMouse a, DelegateMouse b)
    {
        bool present = false;
        IEnumerator it = a.GetInvocationList().GetEnumerator();
        while (it.MoveNext())
        {
            Object o = it.Current;
            if (b.Equals(o))
            {
                present = true;
                break;
            }
        }
        if (!present) a += b;
        return a;
    }
    Et au lieu de faire je fais mais je trouve pas ça terrible
    Si je pouvais faire ça serait mieux (plus court et plus logique)

    Aurais-je le droit de créer une classe " DelegateMouse " tout en ayant la déclaration du delegué ? (premier ligne ci-dessus)
    Mais il me semble qu'on ne peut pas dériver un délégué ... enfin bon, tout ça pour ne pas avoir de redondance dans mes délégués ^^

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 114
    Points : 140
    Points
    140
    Par défaut
    Bonjour,

    pour pouvoir utiliser a.add(b), essaye d'utiliser les extensions.
    Une déclaration comme celle la devrait marcher:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public static class DelegateMouseExtension
    {
      public static DelegateMouse Add(this DelegateMouse a, DelegateMouse b)
      {
        // ta fonction ici
      }
    }
    ensuite tu met just el using vers ta classe si besoin et ça devrais rouler.

  9. #9
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Hello,

    ce que je me demande, quand même, c'est dans quel cas on peut se retrouver à abonner deux fois la même méthode à un event. Les abonnements d'event, ça se fait pas souvent : en général peu après la création de l'objet en question. Je vois pas trop comment on peut se retrouver à un moment donné avec un objet entre les pattes sans savoir s'y on s'est déjà abonné à un de ses events ou pas.

    Donc je vois pas trop quel genre de cas un projet est confronté au problème des abonnements multiples suffisamment de fois pour envisager une solution systématique.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 14
    Points : 15
    Points
    15
    Par défaut
    Je vais tester ta solution ketan

    Guulh, je modifie mes event très souvent vu que je dois gérer 3 événements de la souris (down, move et up) et qu'absolument tout dans le projet doit se faire à la souris !

  11. #11
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par Kistrof Voir le message
    Guulh, je modifie mes event très souvent vu que je dois gérer 3 événements de la souris (down, move et up) et qu'absolument tout dans le projet doit se faire à la souris !
    Euh, je vois pas le rapport. En quoi le fait de concevoir une UI qui fait fortement usage de la souris te force a abonner / désabonner des méthodes aussi souvent ?
    Le scénario le plus simple, c'est la création de l'objet, et l'abonnement a ses méthodes dans la foulée. Ça suffit probablement 95% des besoins, et je me demandais juste ce que ton projet avait de particulier pour justifier de s'écarter de ces cas simples.

  12. #12
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Bonjour

    Moi aussi je plussoie Guuhl, je ne comprends pas cette nécessité d'abonner / desabonner de maniere systématique
    Soit c'est un contexte tres particulier que j'aimerais comprendre pour ma culture générale
    Soit c'est une erreur dans la conception du traiterment

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 14
    Points : 15
    Points
    15
    Par défaut
    Peut-être une erreur dans la conception ... je débute en C# mais pas en développement en général donc je ne suis pas très bien familiarisé avec les spécificités du C#

    Je dois réaliser un éditeur de circuits électriques simples (fil, résistance, pile, lampe et interrupteur) et on me demande de pouvoir tout faire avec la souris, à savoir :
    - placer un fil en "tracé élastique" avec le clic gauche (clic enfoncé, déplace et relache le clic)
    - placer un composant de la meme manière avec le clic droit (aboutit à un menu contextuel qui demande quel composant mettre)
    - pouvoir lancer un mode de simulation en déplaçant la souris vers la droite tout en maintenant les 2 boutons de la souris enfonçés
    - pouvoir revenir en mode d'édition en faisant pareil vers la gauche

    Donc quand je passe en mode simulation, je vire toutes les méthodes des événements pour mettre celles qui gèrent les événements de ce mode. Et inversement quand on repasse en mode édition.

    De plus, j'ai différencié en plusieurs méthodes les différentes actions possibles (mouseUp après un déplacement avec le clic gauche, pareil avec le clic droit, ...)

  14. #14
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut

    Ca deviens plus clair
    Mais a priori je ne vois pas vraiment la nécessité de désabonner / réabonner tout tes event surtout tenant compte de ce que tu dis ici

    pouvoir revenir en mode d'édition en faisant pareil vers la gauche
    Il faut donc que tu continue a gerer les event

    Personnelement je gererais le contexte a l'aide de proprieté qui te permetront de savoir ce qu'il faut faire dans chacun des event

  15. #15
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par olibara Voir le message
    Personnelement je gererais le contexte a l'aide de proprieté qui te permetront de savoir ce qu'il faut faire dans chacun des event
    Je suis d'accord Il n'y a pas une façon unique et sacrée de coder, mais en l'occurrence il ma parait plus simple d'avoir un booléen / une enum indiquant le mode d'édition actuel, et des méthodes qui se comportent différemment selon le mode courant.

  16. #16
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Citation Envoyé par Kistrof
    pouvoir lancer un mode de simulation en déplaçant la souris vers la droite tout en maintenant les 2 boutons de la souris enfonçés
    Ca me semble aussi un peu bizare
    Pourquoi pas le menu contextuel (puisque tu en a un) ou simplement un checkbox a coté de ton plan de dessin ?
    C'est certainement plus simple a réaliser et aussi plus facile a comprendre pour l'utilisateur (qu'il ne faut quand meme pas oublier )

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 14
    Points : 15
    Points
    15
    Par défaut
    Parce que c'est pas moi qui ait fait le cahier des charges et que peux pas le changer !

  18. #18
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Citation Envoyé par Kistrof Voir le message
    Parce que c'est pas moi qui ait fait le cahier des charges et que peux pas le changer !
    Et bien entendu je suppose que c'est celui qui a fait le cahier des charges qui va utiliser et vendre cette application

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 14
    Points : 15
    Points
    15
    Par défaut
    Mais le pire ... c'est que c'est un put*** de projet de fac

  20. #20
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Ah bon !

    Et moi qui m'inquietait pour les utilisteurs

    Mais dans ce cas il n'y a plus qu'a suivre sagement le cahier des charges et te preparer une liste d'enum ou quelques booleens pour determoner le contexte et savoir quoi faire dans chaque event !

    Au final tu verra c'est pas tres compliqué.
    Une chose importante pour tes tracés est aussi de garder parmis tes propriérés le point de la position de reference que tu determine sur l'event voulu dans le CC

Discussions similaires

  1. Portabilitée : Surcharge opérateur de comparaison
    Par Dimitri_87 dans le forum C++
    Réponses: 11
    Dernier message: 15/12/2006, 16h14
  2. Surcharge opérateur +
    Par nunurs83 dans le forum C++
    Réponses: 6
    Dernier message: 31/10/2006, 09h48
  3. [Débutant]Surcharge opérateur +
    Par Geolem dans le forum Débuter
    Réponses: 13
    Dernier message: 05/12/2005, 10h16
  4. surcharge opérateur << et >>
    Par Azharis dans le forum Débuter
    Réponses: 11
    Dernier message: 02/11/2005, 21h22
  5. Surcharge opérateurs
    Par ghostdogpr dans le forum C++
    Réponses: 5
    Dernier message: 18/03/2005, 11h51

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