2014-09-11 10 views
12

bekam ich etwas verwirrt, wie der folgende Code funktioniertWarum kann ich die Equals-Methode überschreiben, wenn meine Klasse nichts erbt?

public class DefaultClass 
{ 
    public override bool Equals(object obj) 
    { 
     return base.Equals(obj); 
    } 
} 

Meine Frage ist: Ich bin nicht jede Klasse vererben, aber wie kann ich Equals Methode noch in der Lage zu überschreiben. Dieser Code wird in VS2010 perfekt kompiliert. Irgendeine Idee, wie das funktioniert?

+14

_ "wenn meine Klasse von etwas erbt nicht?" _ Sie sind auf dem falschen Weg, weil ([fast] (http: // blogs. msdn.com/b/ericlippert/archive/2009/08/06/not-everything-der-from-object.aspx)) jede Klasse erbt von 'Object'. –

+4

@TimSchmelter: Schließen - jede Klasse * erbt * von 'Objekt'. Dinge wie Schnittstellen und Zeiger erben nicht, weil sie keine Klassen sind. – Gabe

+3

@Gabe: Ja, Klasse mit Typ ersetzen und _nearly_ ist richtig. Aber nicht nur Klassen, sondern auch Typen wie "struct" oder "enum" leiten sich aus dem Objekt ab. –

Antwort

32

Da Ihre DefaultClass standardmäßig von object "erbt".

Sie überschreiben jetzt object.Equals.

Ich verstehe die Verwirrung obwohl. MSDN sagt, dass eine Klasse wie das keine andere Klasse erbt, aber es funktioniert (object):

Vererbung: Keine. Beispiel: class ClassA { }

+4

nur zur Verdeutlichung hinzufügen möchten, alle Typen in C# erbt von der Vaterklasse Objekt, deshalb können Sie alle Instanzen von ref oder Wert auf Objekt verweisen. – Liran

+8

@Liran [Nicht alles ist vom Objekt abgeleitet.] (Http: // blogs.msdn.com/b/ericlippert/archive/2009/08/06/not-everything-der-from-object.aspx) –

+1

Gemäß der ECMA-Spezifikation, jeder 'Typ' anders als' Enum', der von 'ValueType' abgeleitet ist definiert effektiv einen Lagerorttyp und einen Heap-Objekttyp. Der Heap-Objekttyp wird von 'Object' abgeleitet, und der Speicherorttyp kann in' Object' konvertiert werden, aber der Speicherorttyp erbt in der Terminologie der ECMA-Spezifikation nicht vom Objekt [was unter anderem bedeutet, dass X erbt von Y muss ein Wert vom Typ X oder ein Verweis auf ein Objekt vom Typ X direkt als ein Wert vom Typ Y ohne eine die Repräsentation ändernde Umwandlung verwendet werden können. – supercat

9

Object class ist die Elternklasse für alle Klassen und alle Klassen erben von ihm. Also Ihr Default Class erbt auch die Object Klasse

Dies ist die ultimative Basisklasse aller Klassen in .NET Framework; Es ist der Stamm der Typhierarchie.

du eine Baumstruktur verstehen:

     System.Object 
        /   \ 
        /   \ 
       /    \ 
SomeProject.DefaultClass  SomeProject.SomeOtherBaseClass 
             /   \ 
             /   \ 
            /    \ 
        SomeProject.ChildClass1  SomeProject.ChildClass2 

Auf einer seitlichen Anmerkung prüfe auch diese sehr relevant Artikel von Eric Lippert, die Sie zum Verständnis der Objektklasse helfen können: - Not everything derives from object

1

Ihre Standardklasse erbt von Object Klasse. Dies ist die ultimative Basisklasse aller Klassen in .NET Framework. Es ist die Wurzel der Typhierarchie.

Das ist der Grund, warum Sie seine Methoden überschreiben können.

Da alle Klassen in .NET Framework von Object abgeleitet sind, ist jede in der Object-Klasse definierte Methode in allen Objekten im System verfügbar. Abgeleitete Klassen können einige dieser Methoden außer Kraft setzen und sie überschreiben:

  • Equals - Unterstützt Vergleiche zwischen Objekten.
  • Finalize - Führt Bereinigungsvorgänge durch, bevor ein Objekt automatisch zurückgewonnen wird.
  • GetHashCode - Erzeugt eine Zahl, die dem Wert des Objekts entspricht, um die Verwendung einer Hash-Tabelle zu unterstützen.
  • ToString - Erstellt eine lesbare Textzeichenfolge, die eine Instanz der Klasse beschreibt.
1

Objektklasse ist die Basisklasse für alle Klassen Benutzer definiert, wie Sie eine Klasse namens DefaultClass erstellt werden, wird dies durch Unterklasse für Objektklasse.Daher ist die Equals() -Methode bereits in der Object-Klasse definiert, daher überschreiben Sie diese Methode hier.

2

System.Object ist die ultimative Basisklasse aller Klassen in .NET Framework. Es ist die Wurzel der Typhierarchie.

Somit kann die gesamte Klasse die in dieser Klasse definierte Methode überschreiben. In System.Object Class definierte Methoden sind Equals(), Finalize(), GetHashCode() und ToString().

2

Ihr Verständnis, dass Sie nicht von irgendeiner Klasse erben, ist nicht richtig.

See: Object.Equals Method (Object) - MSDN

Da die Object Klasse ist die Basisklasse für alle Typen in der .NET Framework ist, die Object.Equals(Object) Methode, um die Standardgleichheitsvergleich für alle anderen zur Verfügung stellt. Die Typen überschreiben jedoch häufig die Equals-Methode, um die Wertegleichheit zu implementieren.

Aber, denken Sie daran zu lesen: Not everything derives from object - Eric Lippert

Verwandte Themen