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 :

Compréhension d'une méthode dans une classe [Débutant]


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Novembre 2015
    Messages : 35
    Points : 24
    Points
    24
    Par défaut Compréhension d'une méthode dans une classe
    Bonjour,

    Je ne connais pas le C#, mais j'essai de retranscrire une class écrite en c# et j'aurais besoin d'aide.
    je ne comprends pas comment passer l'argument "tolerance" avec cette "method":
    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
    public static bool operator ==(Point3D left, Point3D right)
    {
        return left.Equals(right);
    }
    [Pure]
    public bool Equals(Point3D other, double tolerance)
    {
        if (tolerance < 0)
         {
              throw new ArgumentException("epsilon < 0");
         }
     
          return Math.Abs(other.X - this.X) < tolerance &&
                       Math.Abs(other.Y - this.Y) < tolerance &&
                       Math.Abs(other.Z - this.Z) < tolerance;
    }
    Je ne comprends même pas comment cela peut fonctionner , parce que l'argument "tolerance" n'est pas optionnel, mais comme je connais pas le C#...
    Pouvez vous m'éclairer svp

    Merci

  2. #2
    Membre chevronné
    Avatar de PixelJuice
    Homme Profil pro
    Ingénieur .NET & Game Designer
    Inscrit en
    Janvier 2014
    Messages
    639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur .NET & Game Designer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 639
    Points : 2 148
    Points
    2 148
    Par défaut
    Bonjour,

    La classe Object qui est en gros la classe de base ultime contient par défaut une méthode Equals(object other) dont hérite tous les objets. D'où la possible utilisation sans le paramètre tolerance.

    Cela dit, cette méthode de base ne fait en gros qu'une banale comparaison pour savoir si 2 objets sont rigoureusement les mêmes (le même espace mémoire utilisé).

    D'où le code que tu présentes, qui permet de redéfinir l'égalité entre 2 objets, comme typiquement 2 points dans un espace 3D.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Novembre 2015
    Messages : 35
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par PixelJuice Voir le message
    Bonjour,

    La classe Object qui est en gros la classe de base ultime contient par défaut une méthode Equals(object other) dont hérite tous les objets. D'où la possible utilisation sans le paramètre tolerance.

    Cela dit, cette méthode de base ne fait en gros qu'une banale comparaison pour savoir si 2 objets sont rigoureusement les mêmes (le même espace mémoire utilisé).

    D'où le code que tu présentes, qui permet de redéfinir l'égalité entre 2 objets, comme typiquement 2 points dans un espace 3D.
    Merci PixelJuice... J'avais compris le fonctionnement de l'opérateur d'égalité mais , je pensais que la méthode 'Equals' dans ma classe était prioritaire par rapport à la méthode par défaut (En Tcl, ma méthode définie dans ma classe serait prioritaire, car cette dernière supprimerait ma méthode portant le même nom). Finalement pour mon
    information personnel , en C# vous pouvez avoir deux méthodes avec le même nom, mais du moment que le nombre d'arguments est différents , le language s'adaptera en fonction, intéressant...

    Merci encore

  4. #4
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 897
    Points : 1 913
    Points
    1 913
    Par défaut
    Il te suffit de fournir toi-même la valeur pour la tolérance, par exemple left.Equals(right, 0.01);.

  5. #5
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par Mkn31 Voir le message
    en C# vous pouvez avoir deux méthodes avec le même nom, mais du moment que le nombre d'arguments est différents , le language s'adaptera en fonction, intéressant...
    C'est plus fin que cela. Il faut que la signature soit différente. Le nombre d'argument est pris en compte, mais aussi leur type (C# est fortement typé, contrairement à TCL).

    Ce qui se passe ici est simplement ce que l'on appelle une surcharge de méthode. Et ce n'est pas propre au C# (java, c++, ...) ont exactement le même mécanisme.

    Si la méthode Equals est bien définie au niveau de la classe Object (qui est la classe mère de tous les objets), elle est définie comme virtual, c'est-à-dire qu'elle peut être redéfinie dans une classe fille. On peut imaginer ici qu'elle soit redéfinie avec une tolérance par défaut. Si on veut vraiment qu'une tolérance soit spécifiée, on déclenchera plutôt une exception.

    Par contre, on ne pourra pas faire mieux. On ne pourra pas "supprimer" la méthode Equals prenant seulement un paramètre. Le langage ne le supporte pas. En fait, tous les langages POO ne le supporte pas, puisque cela reviendrait à remettre en cause l'héritage.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  6. #6
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Novembre 2015
    Messages : 35
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par François DORIN Voir le message
    C'est plus fin que cela. Il faut que la signature soit différente. Le nombre d'argument est pris en compte, mais aussi leur type (C# est fortement typé, contrairement à TCL).

    Ce qui se passe ici est simplement ce que l'on appelle une surcharge de méthode. Et ce n'est pas propre au C# (java, c++, ...) ont exactement le même mécanisme.

    Si la méthode Equals est bien définie au niveau de la classe Object (qui est la classe mère de tous les objets), elle est définie comme virtual, c'est-à-dire qu'elle peut être redéfinie dans une classe fille. On peut imaginer ici qu'elle soit redéfinie avec une tolérance par défaut. Si on veut vraiment qu'une tolérance soit spécifiée, on déclenchera plutôt une exception.

    Par contre, on ne pourra pas faire mieux. On ne pourra pas "supprimer" la méthode Equals prenant seulement un paramètre. Le langage ne le supporte pas. En fait, tous les langages POO ne le supporte pas, puisque cela reviendrait à remettre en cause l'héritage.
    Merci Francois , pour ton explication et ta leçon sur la POO, super intéressant

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

Discussions similaires

  1. [Python 3.X] Méthode appelant une autre méthode dans les classes
    Par zeddiccus dans le forum Général Python
    Réponses: 4
    Dernier message: 24/02/2019, 10h55
  2. Masquer une méthode dans la classe finale
    Par azur668 dans le forum C#
    Réponses: 8
    Dernier message: 11/06/2013, 10h20
  3. appler une méthode dans la classe main
    Par ebenmous dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 18/06/2011, 16h34
  4. Appeler une méthode dans la classe main
    Par Palsajicoco dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 04/05/2011, 11h40
  5. Problème de compréhension d'une classe
    Par goldorax113 dans le forum Langage
    Réponses: 5
    Dernier message: 25/10/2006, 22h50

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