2010-12-05 12 views
1

Ich habe Basisklasse Class1 und eine abgeleitete Klasse2. Ich erstelle zwei Instanzen von class2, aber definiert als class1. Mein Problem ist, dass ich keinen generischen Vergleich zwischen diesen Objekten machen kann. sind hier ein Beispiel:Statischer Operator == nicht überbewertete Methode

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."); 
     } 
    } 

wenn ich die Zeile:

if (obj1 == obj2) 

für:

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

alles in Ordnung ist, aber wenn obj1 und obj2 Class3 sind ich Fehler

Wie kann ich es lösen?

Danke

Crandel

+0

Versuchen Sie, einen wertebasierten Vergleich seit C# prvoide standard reference == automatisch durchzuführen. – rerun

+1

Meinen Sie "überladen" oder "außer Kraft gesetzt"? Überbewertet bedeutet etwas anderes. Welchen Fehler bekommst du? – Oded

+0

Soweit ich verstehe statische Methoden sind überlastet und nicht überschrieben. Vielleicht erwarte ich ein übersteuertes Ergebnis: S. Ich versuche es nicht wirklich, aber ich nehme an, dass ein Cast-Fehler – Crandel

Antwort

0

Fügen Sie Ihre Betreiber Überlastungen auf alle Klassen, in Ihrem Beispiel, es zu Class1 hinzufügen, wie gut es

+0

Ich möchte den Operator in allen abgeleiteten Klassen definieren, um seine eigenen Eigenschaften zu vergleichen. Class2 kann Property1 und Property2 vergleichen. Class3 kann Property1 und Property3 vergleichen. Aber du hast Recht, ich muss es in der Basisklasse – Crandel

0

Meiner Meinung nach an der Arbeit ist es eine schlechte Idee um die Operatoren == und! = überhaupt zu überladen, da die Standard-Semantik mit Referenztypen Referenzen anstelle von Werten vergleicht. Ich würde lieber bool Equals (System.Object) und Int GetHashCode() überschreiben und Equals für den Vergleich von Werten verwenden - IMHO macht den Code besser lesbar durch Verringerung der Mehrdeutigkeit.

+0

tun, ich weiß, aber ich möchte Referenztyp nicht vergleichen. Manchmal habe ich zwei Instanzen des gleichen Objekts und ich muss feststellen, ob es das gleiche gibt oder nicht. – Crandel

+1

[MSDN] (http://msdn.microsoft.com/en-us/library/ms173147.aspx) empfiehlt: "Wenn ein Typ unveränderlich ist, dh die in der Instanz enthaltenen Daten nicht geändert werden können, wird der Operator' == überschrieben Der Vergleich von Wertgleichheit anstelle von Referenzgleichheit kann nützlich sein, da sie als unveränderliche Objekte gleich betrachtet werden können, solange sie denselben Wert haben. Das Überschreiben des Operators '==' in nicht unveränderlichen Typen wird nicht empfohlen. " –

+0

Ich stimme zu, vielleicht ist mein Problem, wenn ich das zweite Objekt stattdessen erstelle, um festzustellen, ob das Objekt bereits existiert. – Crandel

Verwandte Themen