this question here을 읽음으로써 this article here으로 이어진다.내 추상 기본 클래스의 모든 확장에 사용할 기본 GetHashCode()를 구현할 수 있습니까?
나는 추상적 인 기본 클래스를 가지고 있는데,이를 통해 추상적 인 기본 클래스 (기본 다형성)를 확장하는 클래스 만 수락하도록 메서드를 제한 할 수 있습니다. 내 질문은 : GetHashCode()
내 구체적인 기본 구현에 대한 구현을위한 적절한 재정의를 제공하기 위해 구현할 수 있습니까? (즉 각 구상 클래스에 GetHashCode()
을 무시 방지 할 수 있습니다.) 나는이 같은 내 추상 기본 클래스 뭔가 방법을 상상하고있어
:
public abstract class FooBase
{
private static readonly int prime_seed = 13;
private static readonly int prime_factor = 7;
public override int GetHashCode()
{
// Seed using the hashcode for this concrete class' Type so
// two classes with the same properties return different hashes.
int hash = prime_seed * this.GetType().GetHashCode();
// Get this concrete class' public properties.
var props = this.GetType().GetProperties(BindingFlags.Public);
foreach (var prop in props)
{
// Factor in each of this concrete class' public properties' hashcodes.
hash = (hash * prime_factor) + prop.GetHashCode();
}
return hash;
}
}
이 몇 가지 기본적인 평등의 단위 테스트하지만 난에서 작동하는 것 같다을 내가 뭔가를 간과 한 것 같은 느낌. 컴파일러를 피하기 위해 각 구체적인 클래스에서 재정의를 제공해야합니다. GetHashCode()를 재정의하지 말고 경고해야합니다.하지만 적어도이 방법을 사용하면 각 클래스에 대한 구현을 수동으로 작성하지 않아도됩니다.
은 해시 반영에 시간이 걸릴 것 같습니다. –
다음은 GetHashCode() 및 Equals()의 구현 및 사용에 대한 내용과 서로의 관계에 대해 더 자세히 설명했습니다. 더 나은 이해를 얻은 후에 위의 작업 중 GetHashCode() 기본 코드를 파기했습니다. 그 오래된 NBC 공익 광고들 중 하나를 큐에 넣으십시오 : 더 많이 알기를 ... – JMD
'structs'에서'GetHashCode()'를 오버라이드시키는 것이 항상 좋은 이유 중 하나는 이것과 같은 일반적인 아이디어를 사용하는 디폴트를 피하는 것입니다. 대부분의 경우 작동하지만, 1 분 안에 코딩 할 수있는 가장 간단한'GetHashCode()'오버라이드보다 훨씬 느립니다. –