Operatorüberladung
-
Hi!
Ich versuche gerade, mich ein wenig in C# einzuarbeiten, zumindest die Grundlagen will ich ein wenig verstehen, hab aber gerade einige Probleme der Überladung von Operatoren, hier am Beispiel von operator== und operator!=
Als Beispiel habe ich ein stark vereinfachte Buchklasse aus Marcus' "OOP für Dummies", die nur Titel, Autor und eine Bewertung als strings speichern kann. Der Vergleich soll jeweils diese drei Strings vergleichen und das entsprechende Ergebnis zurückliefern.
public class Buch { private string Titel; private string Autor; private string Bewertung; public Buch() { //"Leeres" Buch Titel = "<Unbekannt>"; Autor = "<Unbekannt>"; Bewertung = "<Unbekannt>"; } public Buch(string Titel, string Autor, string Bewertung) { this.Titel = Titel; this.Autor = Autor; this.Bewertung = Bewertung; } public static Boolean operator==(Buch Buch1, Buch Buch2) { return ( (Buch1.Titel == Buch2.Titel) && (Buch1.Autor == Buch2.Autor) && (Buch1.Bewertung == Buch2.Bewertung) ); } public static Boolean operator!=(Buch Buch1, Buch Buch2) { return ( (Buch1.Titel != Buch2.Titel) || (Buch1.Autor != Buch2.Autor) || (Buch1.Bewertung != Buch2.Bewertung) ); } } }
Ich bekomme aber einen Compilererror: "D:\Programmierung\Projekte\Tests\Buch.cs(8): 'Tests.Buch' definiert den Operator == oder !=, aber überschreibt Object.Equals(object o) nicht"
Was mach ich falsch?Hab ich das richtig verstanden: In C# darf ich u.a. den Operator = nicht überladen; kann ich davon ausgehen, dass der Compiler für mich alle nötigen Arbeiten bei direkten Zuweisungen á la Buch1 = Buch2 erledigt, d.h. eine "tiefe Kopie" gibt es aufgrund der im Gegensatz zu C++ anderen "Zeigerverwendung" nicht mehr?
[ Dieser Beitrag wurde am 05.11.2002 um 23:01 Uhr von Ferly editiert. ]
-
Hi,
wenn man den operator== überlädt, dann muß auch die Equals() Methode überladen werden, um dieselben Funktionen bereitzustellen. (Frei wiedergegeben aus der MSDN)
public class Buch { private string Titel; private string Autor; private string Bewertung; public Buch() { //"Leeres" Buch Titel = "<Unbekannt>"; Autor = "<Unbekannt>"; Bewertung = "<Unbekannt>"; } public Buch(string Titel, string Autor, string Bewertung) { this.Titel = Titel; this.Autor = Autor; this.Bewertung = Bewertung; } public static Boolean operator==(Buch Buch1, Buch Buch2) { return ( (Buch1.Titel == Buch2.Titel) && (Buch1.Autor == Buch2.Autor) && (Buch1.Bewertung == Buch2.Bewertung) ); } public static Boolean operator!=(Buch Buch1, Buch Buch2) { return ( (Buch1.Titel != Buch2.Titel) || (Buch1.Autor != Buch2.Autor) || (Buch1.Bewertung != Buch2.Bewertung) ); } public override bool Equals(object obj) { return (obj is Buch) && (this == (Buch)obj); } } }
-
Original erstellt von Ferly:
**Hab ich das richtig verstanden: In C# darf ich u.a. den Operator = nicht überladen; kann ich davon ausgehen, dass der Compiler für mich alle nötigen Arbeiten bei direkten Zuweisungen á la Buch1 = Buch2 erledigt, d.h. eine "tiefe Kopie" gibt es aufgrund der im Gegensatz zu C++ anderen "Zeigerverwendung" nicht mehr?
**Um eine tiefe Kopie zu machen, musst deine Klasse das ICloneable-Interface implemetieren.
public class Buch : ICloneable
{
//... public object Clone() { return new Buch( this.Titel, this.Autor, this.Bewertung); }
}[/code]
-
Sorry, hat ein wenig länger gedauert... Danke erstmal euch beiden, sowohl die op== Überladung als auch die tiefe Kopie funktioniert soweit ganz gut.
Eine Frage hab ich aber noch...Wozu wird die "GetHashCode"-Fkt. intern verwendet? In der Dokumentation konnte ich dazu leider keine nähere Beschreibung finden. Ist es sinnvoll, einen "ordentlichen" Hashcode zu errechnen, oder reicht die Rückgabe eines Dummy-Wertes (0)?
Grüße,
Ferly[ Dieser Beitrag wurde am 08.11.2002 um 00:50 Uhr von Ferly editiert. ]
-
Original erstellt von Ferly:
Wozu wird die "GetHashCode"-Fkt. intern verwendet? In der Dokumentation konnte ich dazu leider keine nähere Beschreibung finden. Ist es sinnvoll, einen "ordentlichen" Hashcode zu errechnen, oder reicht die Rückgabe eines Dummy-Wertes (0)?http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemobjectclassgethashcodetopic.asp
Classes that might be used as a key in a hash table must also override this method.Also, wenn Du Deine Objekte in ne Hashtable stecken willst, dann bau so ne Funktion. Wenn nicht, isses egal, dann verlaß Dich auf Object.GetHashCode.
Meistens sollte es reichen, einfach die HashCodes der Attribute zu XOR-en. So wie das Beispiel für Point bei obigem Link. Ist ja auch kein großer Aufwand, aber die HashTable, wfalls Du mal eine verwenden willst, wird sehr dankbar sein.
-
Original erstellt von volkard:
[quote]
Meistens sollte es reichen, einfach die HashCodes der Attribute zu XOR-en. So wie das Beispiel für Point bei obigem Link. Ist ja auch kein großer Aufwand, aber die HashTable, wfalls Du mal eine verwenden willst, wird sehr dankbar sein.Ok, das stimmt, das ist kein großes Problem. Danke für den Link, war genau das was ich suchte
Dank und Gruß,
Ferly