2012-10-21 2 views
1

나는 그것을 처리하는 방법, obj가 슈퍼 클래스 인 경우하위/수퍼 클래스를 처리 할 때 Equals (object obj)를 재정의하는 올바른 방법은 무엇입니까?

public override bool Equals(object obj) 
{ 
    // Equals must return false on compares to null. 
    if (obj == null || GetType() != obj.GetType()) 
     return false; 

    Foo fooItem = obj as Foo; 

    return fooItem.FooId == this.FooId; 
} 

같음을 테스트하려면 다음 코드를 사용하고? 항상 거짓을 반환해야합니까, 아니면 시간이 있어야 사실입니까?

어떻게 비교합니까?

답변

3

정말 평등을 의미하는 것으로 달려 있습니다.

다른 클래스 간의 평등을 허용 한 적이 없다고 생각합니다. 그래도 그런 경우가있을 수 있습니다.

맞춤 IEqualityComparer<T>도 사용할 수 있습니다. 이것은 평범하지 않은 방식으로 평등을 테스트하고 싶을 때 좋은 전략입니다. 다른 상황의 다른 코드가 재정의에 걸리지 않았 음을 의미합니다. Equals는 유형마다 한 번만 재정의 할 수 있지만 원하는만큼 비교자를 가질 수 있습니다.

1

GetType() 비교를 제거하고 obj를 Foo로 첫 번째 줄로 옮기면됩니다.

코드는 다음이에 대한 의미를 전체 가치 비교가 있다고 가정

public override bool Equals(object obj) 
{ 
    var fooItem = obj as Foo; 
    // Equals must return false on compares to null. 
    if (obj == null) { 
     return false; 
    } 

    return fooItem.FooId == this.FooId; 
} 

수있는 모든 푸의도 한두 Equals의 위의 재정의를 구현하는 클래스가 봉인되어 산출했다.

모든 Foos (파생 된 한 번 포함)에 대해 의미있는 값 비교가 없다면 대신 IEqualityComaprer를 사용하는 것이 좋습니다. 다른 모든 인스턴스 메소드와 마찬가지로 클래스 메소드가 보조 메소드가 아닌 유형의 일부인 경우에만 클래스 계층 구조에 포함해야합니다.

0

다음과 같은 객체를 갖는 것이 유용 할 수있는 시나리오가 있지만 서로 다른 유형은 서로 동등하다고보고합니다. 그런 용도에 대해 강력히 권장합니다. 가능한 한 정당하다고 여겨 질 수있는 유일한 시간은 다양한 가상 메서드를 사용하는 봉인 된 Equals 메서드를 포함하는 공통 기본 클래스에서 상속 된 모든 유형이 지원하는 긴급 평등 비교 방법을 개체에 요청하면 최상의 사용 가능한 방법이며 급송 방법을 사용할 수없는 경우 객체를 표준 형식으로 변환하여 비교합니다.

예를 들어, 인수가 두 개인 색인화 된 속성 가져 오기 도구를 구현하는 추상 형식 ImmutableFloatingPointMatrix을 고려하십시오. 두 개의 행렬은 크기가 같고 동일한 위치에 동일한 값을 갖는 경우 같아야합니다. 파생 클래스가 2 차원 배열을 사용하여 행렬의 내용을 유지하는 것은 가능하지만 다른 많은 저장 방법이 가능합니다. 예를 들어, 필드가 하나 인 구체 IdentityMatrix 클래스는 항상 Sizex이라는 차원을보고하며 주 대각선의 셀에는 1.0을 반환하고 다른 곳에서는 0.0을 반환하는 인덱스 속성을가집니다. 하나는 Size - 항목 배열을 사용하여 대각선에 물건을 넣을 수있는 DiagonalMatrix을 가질 수 있습니다. 임의의 2 개의 행렬은 대응하는 모든 요소를 ​​검사함으로써 동등성을 비교할 수 있지만, 예를 들어, IdentitymMatrix에 대한 DiagonalMatrix은 두 행렬이 동일한 크기이고 배열의 모든 항목이 1.0이되도록 보장함으로써 더 잘 처리 될 수 있습니다 (주 대각선 바깥에있는 점을 확인하지 않아도 됨).

Equals의 의미가 현저하게 정의되어 유형이 다른 객체가 자신을 동일하다고보고하는 유형 인 경우에도 최상의 아이디어는 아닐 수 있습니다. 사용자 정의 EqualityComparer을 사용할 수있는 경우에는 Equals의 이상한 재정의보다 나을 수 있습니다.