2009-10-20 19 views
5

Tengo una necia duda. Generalmente, "System.Object" implementa "Igual". Cuando implemente IEtabletable interface puedo dar una definición personalizada (creo que sí) a mi "Igual".Internos de "iguales" en .NET

por lo que la implementación de la clase el profesor es igual a

class Professor:System.Object,IEquatable 

ya que existen diferentes definiciones de System.Equals, e igual de IEquatable, ¿por qué no lo hicieron C# informe de error? .Porque no estoy superior "es igual a" e incluso no Ocultar "Iguala" usando nueva palabra clave.

class Professor : IEquatable<Professor> 
{ 

    public string Name { get; set; } 

    public bool Equals(Professor cust) 
    { 
     if (cust == null) return false; 
     return cust.Name == this.Name; 
    } 

} 
+1

Sugiero hacer su pregunta de IComparable como una pregunta separada, porque es más una cuestión de diseño, mientras que su pregunta principal está más relacionada con las agallas de.Modelo de objetos de NET. – Welbog

+0

ok lo haré – user193276

Respuesta

8

ni eres primordial ni ocultar Object.Equals() porque su versión toma el profesor como un tipo de parámetro - no objeto. Usted es overloading el método Equals().

C# permite que dos métodos con el mismo nombre difieran en el tipo de argumento (s) que aceptan. Esto se conoce como sobrecarga, se puede ver como polimorfismo en tiempo de compilación.

Overriding (que usted podría, y probablemente también debería hacer) altera la implementación de un método desde su versión en una clase base. Es la base del polimorfismo del tipo de tiempo de ejecución.

Hiding es una técnica menos común que permite una clase derivada a máscara una versión de un método en una clase base. Según el tipo de referencia a través del cual realiza la llamada, puede obtener obtener la versión de clase base (si se llama a través de una referencia de clase base) o la versión de clase derivada (si se llama a través de una referencia de tipo derivado).

En su segunda pregunta, debe usar IEquatable<T> cuando hay semántica para comparar 'igualdad' de dos instancias que es independiente de la igualdad de referencia.

Debe implementar IComparable o IComparable<T> cuando hay semántica para pedir artículos. Lo que significa que pueden ser menores, mayores que, o equivalentes.

+0

Muéstremelo :) He notado cierta confusión sobre la idea de tener sobrecargas donde la firma de uno es más específica pero compatible con otra. (por ejemplo, Profesor> objeto) –

+0

entonces, ¿puedo decir que la sobrecarga es un polimorfismo en tiempo de compilación y la anulación es un polimorfismo en tiempo de ejecución? – user193276

+0

@generix: Sí, puedes. Lea esto: http://wiki.answers.com/Q/Difference_between_runtime_and_compile_time_polymorphism – LBushkin

1

El método Object.Equals acepta un objeto de tipo 'objeto' como su parámetro. Su método Equals acepta un objeto de tipo 'Profesor' como su parámetro. Ambos métodos pueden coexistir porque es legal diferenciar dos métodos idénticos por su lista de parámetros; esto es sobrecarga de método de llamada.

1

No necesita implementar explícitamente IEquatable si todo lo que quiere hacer es anular la implementación predeterminada de Equals().

Usted sólo puede hacer algo como esto:

class Professor 
{ 

    public string Name { get; set; } 

    public override bool Equals(object cust) 
    { 
     if (cust == null || !(cust is Professor)) return false; 
     return cust.Name == this.Name; 
    } 

} 

Tenga en cuenta que si se sobrescribe equals() también debe reemplazar GetHashCode() para asegurar el funcionamiento correcto de diccionarios y otras colecciones que hacen uso de hash a diferenciar entre objetos. Aquí está la página de MSDN guidelines for overriding Equals().

Cuestiones relacionadas