2009-10-20 5 views
5

나는 "어리석은"의심 스럽습니다. 일반적으로 "System.Object"는 "Equals"를 구현합니다. 내가 구현할 때 IEquatable 인터페이스 나는 내 "동등한"사용자 지정 정의 (나는 그렇게)을 줄 수 있습니다. System.Equals의 다른 정의가 있기 때문에 .NET의 "equals"내부 내용

그래서 교수 클래스 구현은

class Professor:System.Object,IEquatable 

동일하며, IEquatable의 같음은, 왜 C# 보고서 오류하지 않았다? .Because 내가 무시하고 있지 않다 "같음" 새로운 키워드를 사용하여 "같음"을 숨기지 않습니다. 반대하지 -

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

IComparable 질문을 별도의 질문으로 제안하는 것이 좋습니다. 그 질문은 설계 질문 일 뿐이므로 주 질문은 더 많은 관련이 있습니다.NET의 개체 모델. – Welbog

+0

괜찮아요. – user193276

답변

8

당신은 어느 오버라이드 (override)도 버전이 매개 변수 유형으로 교수 걸리기 때문에 Object.Equals() 숨어 있습니다. 귀하의 위치는 overloading입니다.

C#에서는 동일한 이름을 가진 두 개의 메서드가 받아 들인 인수의 형식이 다른 것을 허용합니다. 이를 오버로드라고하며 컴파일 타임 다형성으로 볼 수 있습니다.

Overriding (가능할 수도 있고해야 할 수도 있음)은 기본 클래스에서 해당 버전의 메소드 구현을 변경합니다. 런타임 유형 다형성의 기초입니다.

Hiding에 파생 된 클래스가 기본 클래스에게있어서의 버전을 마스크 할 수있는 덜 일반적인 기술이다. 전화를 걸었던 참조 유형에 따라 (기본 클래스 참조를 통해 호출 된 경우) 또는 파생 클래스 버전 (파생 된 유형 참조를 통해 호출 된 경우) 중 하나를 가져올 수 있습니다.

두 번째 질문에 참조 평등과 다른 두 인스턴스의 '동등성'을 비교하는 의미가있는 경우 IEquatable<T>을 사용해야합니다.

주문 항목에 대한 의미가있는 경우 IComparable 또는 IComparable<T>을 구현해야합니다. 의미는 그보다 작거나 같거나 그 이상일 수 있습니다.

+0

저를 괴롭 힙니다. 하나의 서명이 좀 더 구체적이지만 다른 것과 호환되는 오버로드가 발생한다는 생각 때문에 혼란 스러웠습니다. (예 : 교수> 객체) –

+0

그러면 오버로드가 시간 다형성을 컴파일하고 오버라이드가 런타임 다형성이라고 할 수 있습니까? – user193276

+0

@generix : 가능합니다. 읽기 : http://wiki.answers.com/Q/Difference_between_runtime_and_compile_time_polymorphism – LBushkin

1

Object.Equals 메서드는 'object'형식의 개체를 매개 변수로 사용합니다. Equals 메서드는 'Professor'형식의 개체를 매개 변수로 사용합니다. 매개 변수 목록을 사용하여 두 개의 동일하게 이름이 지정된 메소드가 서로 다르기 때문에 두 메소드가 공존 할 수 있습니다. 이 메서드 호출 오버로드입니다.

1

기본 Equals() 구현을 재정의하려는 경우 IEquatable을 명시 적으로 구현할 필요가 없습니다.

당신은 같은 것을 할 수 있습니다

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; 
    } 

} 

는) (같음을 무시할 경우도 GetHashCode를 오버라이드 (override) 할 필요가 있음을 알고 있어야합니다()에 해시를 사용합니다 사전 및 다른 컬렉션의 적절한 작동을 보장하기 위해 객체를 구별합니다. 다음은 MSDN 페이지 guidelines for overriding Equals()입니다.