2014-09-11 7 views
12

ho ottenuto po 'confuso come funziona il seguente codicePerché sono in grado di sovrascrivere il metodo Equals se la mia classe non eredita da qualcosa?

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

La mia domanda è: io non sono ereditando qualsiasi classe, ma come io sono ancora in grado di eseguire l'override Equals metodo. Questo codice viene compilato perfettamente in VS2010. Qualche idea su come funziona?

+14

_ "se la mia classe non eredita da tutto ciò?" _ Sei sulla strada sbagliata, perché ([quasi] (http: // blog. msdn.com/b/ericlippert/archive/2009/08/06/not-everything-derives-from-object.aspx)) ogni classe eredita da 'Object'. –

+4

@TimSchmelter: Close - ogni classe * fa * eredita da 'Object'. Cose come interfacce e puntatori non ereditano perché non sono classi. – Gabe

+3

@Gabe: sì, sostituisce la classe con il tipo e _nearly_ ha ragione. Ma non solo le classi derivano dall'oggetto, anche i tipi di valore come 'struct' o' enum'. –

risposta

32

Perché il tuo DefaultClass 'eredita' da object per impostazione predefinita.

Ora si sta sostituendo object.Equals.

Tuttavia capisco la confusione. MSDN dice che una classe del genere non eredita qualsiasi altra classe, ma lo fa (object):

Ereditarietà: Nessuno. Esempio: class ClassA { }

+4

voglio solo aggiungere per chiarezza, tutti i tipi in C# ereditano dalla classe padre Oggetto, ecco perché puoi fare riferimento a tutte le istanze di qualsiasi riferimento o valore ad oggetto. – Liran

+8

@Liran [Non tutto deriva dall'oggetto.] (Http: // blog.msdn.com/b/ericlippert/archive/2009/08/06/not-everything-derives-from-object.aspx) –

+1

Secondo le specifiche ECMA, ogni 'Tipo' diverso da' Enum' che deriva da 'ValueType' definisce in modo efficace un tipo di posizione di archiviazione e un tipo di oggetto heap. Il tipo di oggetto heap deriva da 'Object' e il tipo di posizione di archiviazione è convertibile in' Object', ma il tipo di posizione di archiviazione non eredita dall'oggetto nella terminologia della specifica ECMA [che tra l'altro implica che se X eredita da Y, un valore di tipo X o un riferimento a un oggetto di tipo X deve essere utilizzabile direttamente come valore di tipo Y senza alcuna conversione di modifica della rappresentazione]. – supercat

9

Object class è la classe padre per tutte le classi e tutte le classi ereditano da essa. Così il vostro Default Class è anche ereditare la classe Object

Questa è la classe base finale di tutte le classi in .NET Framework; è la radice della gerarchia di tipi.

Si può capire questo utilizzando una struttura ad albero:

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

Su un lato nota anche fare controllare questo articolo molto rilevante di Eric Lippert, che possono aiutare a comprendere la classe Object: - Not everything derives from object

1

La classe predefinita eredita dalla classe Object. Questa è l'ultima classe base di tutte le classi in .NET Framework; è la radice della gerarchia di tipi.

Questo è il motivo per cui è possibile sovrascrivere i propri metodi.

Poiché tutte le classi in .NET Framework derivano da Object, tutti i metodi definiti nella classe Object sono disponibili in tutti gli oggetti nel sistema. Le classi derivate possono e sovrascrivono alcuni di questi metodi, tra cui:

  • Equals - Supporta il confronto tra gli oggetti.
  • Finalize - Esegue le operazioni di pulizia prima che un oggetto venga recuperato automaticamente.
  • GetHashCode - Genera un numero corrispondente al valore dell'oggetto per supportare l'utilizzo di una tabella hash.
  • ToString - Produce una stringa di testo leggibile dall'utente che descrive un'istanza della classe.
1

classe Object è la classe di base per tutte le classi definite dall'utente, come si è creato una classe chiamata DefaultClass, questa volontà per classe sub per la classe Object.Quindi il metodo Equals() è già definito nella classe Object, quindi qui sovrascrivere questo metodo.

2

System.Object è l'ultima classe base di tutte le classi in .NET Framework; è la radice della gerarchia di tipi.

Così tutta la classe può sovrascrivere il metodo definito in questa classe. I metodi definiti nella classe System.Object sono Equals(), Finalize(), GetHashCode() e ToString().

2

La tua comprensione che non stai ereditando da nessuna classe non è giusta.

See: Object.Equals Method (Object) - MSDN

Poiché la classe Object è la classe base per tutti i tipi nella .NET Framework, il metodo Object.Equals(Object) fornisce il confronto di uguaglianza di default per tutti gli altri tipi. Tuttavia, i tipi sovrascrivono spesso il metodo Equals per implementare l'uguaglianza di valore.

Ma, ricordarsi di leggere: Not everything derives from object - Eric Lippert

Problemi correlati