Entwickler-Ecke
C# - Die Sprache - Methode von Object überschreiben
kostonstyle - Do 17.09.09 08:51
Titel: Methode von Object überschreiben
Hallo miteinander
habe diverse Fragen.
1. Es gibt im Object gewisse Methode, dass man überschreiben sollte, wie zum Beispiel ToString(), GetHashCode() oder Equals(). Habe bei einem Beispiel gesehen, wie die GetHashCode() Methode überschrieben wird.
C#-Quelltext
1: 2: 3: 4:
| public override int GetHashCode() { return this.TonesFromStandardPitch.GetHashCode(); } |
Macht der Compiler hier rekursive Aufruf oder wird die GetHashCode() Methode irgendwo anders aufgerufen?
2. Wird hier eine neue Instanz angelegt?
C#-Quelltext
1:
| Note note5 = (Note)500; |
Die Klasse Note überlädt die Operatoren.
3. Wie kann eine Variable eine Methode aufrufen, zum Beispiel
C#-Quelltext
1: 2:
| public int TonesFromStandardPitch; return this.TonesFromStandardPitch.CompareTo(other.TonesFromStandardPitch); |
Danke kostonstyle
JüTho - Do 17.09.09 11:51
Mmh, diese Fragen kommen mir doch sehr primitiv vor (genauer: sie befassen sich mit sehr grundlegenden Dingen der OOP).
kostonstyle hat folgendes geschrieben : |
C#-Quelltext 1: 2: 3: 4:
| public override int GetHashCode() { return this.TonesFromStandardPitch.GetHashCode(); } |
Macht der Compiler hier rekursive Aufruf oder wird die GetHashCode() Methode irgendwo anders aufgerufen? |
Es wäre interessant zu wissen, welche Bedeutung das Element TonesFromStandardPitch innerhalb der Klasse hat. Es scheint sich um eine Eigenschaft zu handeln; das ist also innerhalb von this eine Instanz einer anderen Klasse; für diese Klasse gibt es natürlich GetHashCode() - entweder überschrieben oder als ursprüngliche einer anderen Basisklasse oder als diejenige von Object. Also nimmt sich GetHashCode der this-Klasse einfach das Ergebnis von TonesFromStandardPitch.GetHashCode und gibt es als eigenen HashCode aus.
kostonstyle hat folgendes geschrieben : |
2. Wird hier eine neue Instanz angelegt?
C#-Quelltext 1:
| Note note5 = (Note)500; |
Die Klasse Note überlädt die Operatoren. |
Es handelt sich bei '=' um eine
Zuweisung. Also wird die Instanz "500" der Klasse int durch "(Note)" als Instanz der Klasse Note angesehen und der Variablen note5 zugewiesen. Eigentlich ist es nichts anderes als ein weiterer Verweis auf denselben Inhalt des Arbeitsspeichers.
Aber ergänzend solltest du dich mit dem Unterschied zwischen
struct und
class befassen; der spielt vermutlich auch eine Rolle.
kostonstyle hat folgendes geschrieben : |
3. Wie kann eine Variable eine Methode aufrufen, zum Beispiel
C#-Quelltext 1: 2:
| public int TonesFromStandardPitch; return this.TonesFromStandardPitch.CompareTo(other.TonesFromStandardPitch); | |
Das ist doch das übliche Vorgehen. Von einer Klasse wird eine Instanz erzeugt und einer Variablen zugewiesen; dann können alle öffentlichen Methoden (und Eigenschaften) dieser Instanz unter Angabe des Variablennamens benutzt werden.
C#-Quelltext
1: 2:
| int i = 123; string s = i.ToString(); |
Jürgen
Kha - Do 17.09.09 16:34
Primitiv finde ich die Fragen nicht, denn bei #1 und #3 glaube nicht, dass ich sie überhaupt verstanden habe ;) .
Das sicherlich nicht. Zwei Variablen können unmöglich die gleiche Referenz enthalten, solange sie nicht beide Referenztypen sind und ein Typ vom anderen abgeleitet ist(/das Interface implementiert hat, um ganz korrekt zu sein).
Wenn Note eine Klasse ist, wird höchstwahrscheinlich schon eine neue Instanz erzeugt, es kommt aber ganz auf den Code im überladenen Cast-Operator an. Wenn dort ein
new steht, wird es wohl so sein :zwinker: .
JüTho - Do 17.09.09 19:07
@Sebastian
Nach deinen Hinweisen erkenne ich, dass ich mit meiner Antwort doch etwas voreilig war. (Was ich mit "primitiv" gemeint hatte, hatte ich schon erläutert.) Ursprünglich wollte ich so etwas schreiben:
Ohne genauere Informationen, wie die jeweilige Klasse und ihre Member definiert sind, kann man nichts genaueres erläutern.
Ich wusste doch, dass ich mit meinem Hinweis auf "Referenzen" nicht korrekt genug war. Vorsorglich hatte ich auf struct und class hingewiesen.
Jürgen
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!