2010-12-05 49 views
1

J'ai la classe de base Class1 et une classe dérivée2. Je crée deux instances de class2 mais définies comme class1. Mon problème est que je ne peux pas faire une comparaison générique entre ces objets. Voici un exemple:Opérateur statique == ne pas détecter la méthode sur-estimée

public class Class1 
    { 
     public int Property1 = 0; 
    } 

    public class Class2 : Class1 
    { 
     public int Property2 = 0; 

     public static bool operator ==(Class2 c1, Class2 c2) 
     { 
      return c1.Property2 == c2.Property2; 
     } 

     public static bool operator !=(Class2 c1, Class2 c2) 
     { 
      return c1.Property2 != c2.Property2; 
     } 
    } 

    public class Class3 : Class1 
    { 
     public int Property3 = 0; 
    } 

    static void Main(string[] args) 
    { 
     Class1 obj1 = new Class2(); 
     Class1 obj2 = new Class2(); 

     if (obj1 == obj2) 
     { 
      Console.WriteLine("Yes !!! The two objects are equal!"); 
     } 
     else 
     { 
      Console.WriteLine("The two objects are not equal."); 
     } 
    } 

si je change la ligne:

if (obj1 == obj2) 

pour:

if ((Class2)obj1 == (Class2)obj2) 

tout est bien, mais si obj1 et obj2 sont Class3 j'obtiens l'erreur

Comment puis-je le résoudre?

Merci

Crandel

+0

Essayez-vous de faire un comparateur de valeur, puisque C# prvoide référence standard == automatiquement. – rerun

+1

Voulez-vous dire «surchargé» ou «surchargé»? Overrated signifie autre chose. Quelle erreur obtenez vous? – Oded

+0

autant que je sache, les méthodes statiques sont surchargées et non surchargées. Peut-être que je m'attends à un résultat dépassé: S. Je ne l'essaye pas vraiment, mais je suppose une erreur de cast – Crandel

Répondre

0

Ajoutez votre surcharge de l'opérateur à toutes les classes, dans votre exemple ajouter à Class1 et pour faire fonctionner

+0

Je veux définir l'opérateur dans toute classe dérivée pour pouvoir comparer ses propres propriétés. Class2 peut comparer Property1 et Property2. Class3 peut comparer Property1 et Property3. Mais vous avez raison, je dois le faire à la classe de base – Crandel

0

À mon avis, il est une mauvaise idée pour surcharger les opérateurs == et! =, car la sémantique par défaut avec les types de référence est de comparer des références plutôt que des valeurs. Je préfère substituer bool Equals (System.Object) et int GetHashCode() et utiliser Equals pour la comparaison de valeur - IMHO rend le code plus lisible en raison de la réduction de l'ambiguïté.

+0

Je sais, mais je ne veux pas comparer le type de référence. Quelques fois j'ai deux instances du même objet et j'ai besoin de détecter quand il y a le même ou pas. – Crandel

+1

[MSDN] (http://msdn.microsoft.com/fr-fr/library/ms173147.aspx) recommande: "Lorsqu'un type est immuable, ce qui signifie que les données contenues dans l'instance ne peuvent pas être modifiées, surcharge l'opérateur' == 'comparer l'égalité des valeurs au lieu de l'égalité de référence peut être utile parce que, en tant qu'objets immuables, ils peuvent être considérés comme identiques tant qu'ils ont la même valeur: il n'est pas recommandé de substituer l'opérateur' == 'dans les types non-immuables. –

+0

Je suis d'accord, peut-être mon problème est quand je crée le deuxième objet à la place pour détecter si l'objet existe déjà. – Crandel